FileHelper для чтения и загрузки с веб-API - PullRequest
2 голосов
/ 25 апреля 2019

У меня есть список объектов, которые я хочу загрузить в виде csv-файла через Web Api.Однако, когда я проверяю это с Swagger, я не получаю загрузку CSV.Что я делаю неправильно?DailyReportContent содержит 2 объекта.

Это мой код до сих пор:

public IActionResult GetDailyReport(DateTime invoiceDate)
{
    var dailyReportContent = new List<DailyReportModel>().....

    // create csv file
    var engine = new FileHelperEngine<DailyReportModel>
    {
        HeaderText = "headers.."
    };

    using (var stream = new MemoryStream())
    using (var streamWriter = new StreamWriter(stream))
    {
        engine.WriteStream(streamWriter, dailyReportContent);

        var result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "DailyReports.csv" };

        return Ok(result);
    }
}

И это ответ в Swagger:

{
  "version": {
    "major": 1,
    "minor": 1,
    "build": -1,
    "revision": -1,
    "majorRevision": -1,
    "minorRevision": -1
  },
  "content": {
    "headers": [
      {
        "key": "Content-Type",
        "value": [
          "text/csv"
        ]
      },
      {
        "key": "Content-Disposition",
        "value": [
          "attachment; filename=DailyReports.csv"
        ]
      }
    ]
  },
  "statusCode": 200,
  "reasonPhrase": "OK",
  "headers": [],
  "requestMessage": null,
  "isSuccessStatusCode": true
}

РЕДАКТИРОВАТЬ: Даже если я добавлюthis:

 stream.Flush();
 streamWriter.Flush();

 var reader = new StreamReader(stream);
 var readResult = reader.ReadToEnd();

readResult пуст.Итак, я думаю, что что-то идет не так при записи потока?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Исправлено это так:

var csvContent = LoadcsvContent();

var engine = new FileHelperEngine<DailyReportModel>
{
    HeaderText = "......."
};

var stream = new MemoryStream();
TextWriter streamWriter = new StreamWriter(stream);
engine.WriteStream(streamWriter, csvContent);

streamWriter.Flush();
stream.Seek(0, SeekOrigin.Begin);

return File(await stream, "text/csv", $"Report_{invoiceDate:yyyyMMdd}.csv");

Теперь работает как шарм.Выход Swagger:

enter image description here

0 голосов
/ 26 апреля 2019

В ASP.NetCore у нас есть return File(ret, "application/octet-stream", fileName);

Вернуть файл с нужным нам типом, в моем случае для пакета .msi, который я использую "application/octet-stream", для вас вы можете указать тип возврата как .CSV здесь на уровне контроллера или на глобальном уровне в WebApiConfig класс для Formatters

0 голосов
/ 25 апреля 2019

Я думаю, вам нужно

return result;

Возвращение «Ok (<объект>)» вернет ответное сообщение, содержащее объект.
Вы уже создали свое ответное сообщение и указали весь контент.
Поэтому я думаю, что вы возвращаете ответ OK, содержащий другое сообщение ответа OK.

...