如何在来自网络的响应中附加文件 API
how to attach a file in a response from web API
我需要在 ASP.NET Core 中的 webAPI 中生成一个 Excel 文件,其中包含从 aurelia 网络应用程序接收的数据。流程是这样的:
在前端我提出请求
Print(printData: PrintData) {
return this.http
.fetch(`planning/Print`, {
method: "post",
body: json(printData)
})
.then(response => response.json())
.catch(error => {
console.log(error);
});
}
在网络 API 控制器中,我获取数据并使用 ClosedXML 库生成 Excel 文件
[HttpPost]
[Route("Print")]
public async Task<IActionResult> Print([FromBody] PrintDataVM data)
{
var getResponse = await mediator.Send(new PrintPlanning(data));
return Ok(getResponse);
public async Task<XLWorkbook> PrintPlanning(PrintDataVM data)
{
using (XLWorkbook workBook=new XLWorkbook())
{
var workSheet= workBook.Worksheets.Add("Horas");
workSheet.Cell("A1").Value = "Hola";
return workBook;
}
在我的控制器中 getResponse 是这样的
我开始疑惑了,因为我不知道我应该得到这个对象还是内存流。我不知道如何让前端得到这个,以便一旦收到我就可以在那里处理它。
现在这显然给我错误
有什么想法吗?
此致
将您的文件保存到流和 return 文件
var getResponse = await mediator.Send(new PrintPlanning(data));
var ms = new MemoryStream();
getResponse.SaveAs(ms);
ms.Position = 0;
return File(ms, "application/octet-stream", "filename");
或使用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
代替application/octet-stream
您可以使用此扩展来简化事情:https://www.nuget.org/packages/ClosedXML.Extensions.WebApi/
用法
在您的 WebApi 控制器中定义一个将生成并下载您的文件的操作:
public class ExcelController : ApiController
{
[HttpGet]
[Route("api/file/{id}")]
public async Task<HttpResponseMessage> DownloadFile(int id)
{
var wb = await BuildExcelFile(id);
return wb.Deliver("excelfile.xlsx");
}
private async Task<XLWorkbook> BuildExcelFile(int id)
{
//Creating the workbook
var t = Task.Run(() =>
{
var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Sheet1");
ws.FirstCell().SetValue(id);
return wb;
});
return await t;
}
}
免责声明:我是作者。
我需要在 ASP.NET Core 中的 webAPI 中生成一个 Excel 文件,其中包含从 aurelia 网络应用程序接收的数据。流程是这样的: 在前端我提出请求
Print(printData: PrintData) {
return this.http
.fetch(`planning/Print`, {
method: "post",
body: json(printData)
})
.then(response => response.json())
.catch(error => {
console.log(error);
});
}
在网络 API 控制器中,我获取数据并使用 ClosedXML 库生成 Excel 文件
[HttpPost]
[Route("Print")]
public async Task<IActionResult> Print([FromBody] PrintDataVM data)
{
var getResponse = await mediator.Send(new PrintPlanning(data));
return Ok(getResponse);
public async Task<XLWorkbook> PrintPlanning(PrintDataVM data)
{
using (XLWorkbook workBook=new XLWorkbook())
{
var workSheet= workBook.Worksheets.Add("Horas");
workSheet.Cell("A1").Value = "Hola";
return workBook;
}
在我的控制器中 getResponse 是这样的
我开始疑惑了,因为我不知道我应该得到这个对象还是内存流。我不知道如何让前端得到这个,以便一旦收到我就可以在那里处理它。 现在这显然给我错误
有什么想法吗?
此致
将您的文件保存到流和 return 文件
var getResponse = await mediator.Send(new PrintPlanning(data));
var ms = new MemoryStream();
getResponse.SaveAs(ms);
ms.Position = 0;
return File(ms, "application/octet-stream", "filename");
或使用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
代替application/octet-stream
您可以使用此扩展来简化事情:https://www.nuget.org/packages/ClosedXML.Extensions.WebApi/
用法
在您的 WebApi 控制器中定义一个将生成并下载您的文件的操作:
public class ExcelController : ApiController
{
[HttpGet]
[Route("api/file/{id}")]
public async Task<HttpResponseMessage> DownloadFile(int id)
{
var wb = await BuildExcelFile(id);
return wb.Deliver("excelfile.xlsx");
}
private async Task<XLWorkbook> BuildExcelFile(int id)
{
//Creating the workbook
var t = Task.Run(() =>
{
var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Sheet1");
ws.FirstCell().SetValue(id);
return wb;
});
return await t;
}
}
免责声明:我是作者。