【问题标题】:how to attach a file in a response from web API如何在来自 Web API 的响应中附加文件
【发布时间】:2020-02-24 21:41:58
【问题描述】:

我需要在 ASP.NET Core 的 webAPI 中生成一个 Excel 文件,其中包含从 aurelia web 应用程序接收到的数据。流程是这样的: 在前端我提出请求

Print(printData: PrintData) {
return this.http
  .fetch(`planning/Print`, {
    method: "post",
    body: json(printData)
  })
  .then(response => response.json())
  .catch(error => {
    console.log(error);
  });

}

在 Web 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 中是这样的

我的疑惑从这里开始,因为我不知道我应该得到这个对象还是内存流。我不知道如何让前端得到这个,以便一旦收到我就可以在那里处理它。 现在这显然给了我错误

有什么想法吗?

问候

【问题讨论】:

    标签: c# asp.net-core aurelia closedxml


    【解决方案1】:

    保存您的文件以流式传输并返回文件

    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

    【讨论】:

      【解决方案2】:

      你可以使用这个扩展来简化事情: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;
          }
      }
      

      免责声明:我是作者。

      【讨论】:

      猜你喜欢
      • 2021-03-14
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2011-10-14
      • 2018-04-28
      • 2020-01-13
      相关资源
      最近更新 更多