как прикрепить файл в ответе от веб-API - PullRequest
1 голос
/ 29 октября 2019

Мне нужно создать файл Excel в моем webAPI в ASP.NET Core с данными, полученными из веб-приложения 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 я получаю данные и генерирую файл Excel с использованием библиотеки ClosedXML

[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 это getResponse

getResponse

и здесь начинаются мои сомнения, потому что я не знаюесли я должен получить этот объект или поток памяти. Я не знаю, как сделать так, чтобы веб-интерфейс получил это, чтобы после получения я мог лечить его там. Прямо сейчас это дает мне ошибку, очевидно

Любая идея, пожалуйста?

С уважением

error fetch

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы можете использовать это расширение для упрощения вещей: 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;
    }
}

Отказ от ответственности: я автор.

1 голос
/ 29 октября 2019

Сохраните ваш файл в поток и верните файл

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

...