3
votes

FileHelper lu pour diffuser et télécharger avec l'API Web

J'ai une liste d'objets que je souhaite télécharger sous forme de fichier csv via Web Api. Cependant, lorsque je teste cela avec Swagger, je n'obtiens pas de téléchargement csv. Qu'est-ce que je fais mal? DailyReportContent contient 2 objets.

Voici mon code pour l'instant:

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

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

Et voici la réponse dans 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
}

EDIT: Même si j'ajoute ceci:

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);
    }
}

Le readResult est vide. Donc je suppose qu'il y a un problème lors de l'écriture du flux?


0 commentaires

3 Réponses :


0
votes

Je pense que vous devez

return result;

Renvoyer "Ok ()" renverra un message de réponse contenant l'objet.
Vous avez déjà créé votre message de réponse et spécifié tout le contenu.
Je pense donc que vous renvoyez une réponse OK, contenant un autre message de réponse OK.


2 commentaires

Non, ça n'aide pas. me donne exactement la même réponse et aucun fichier csv de téléchargement. :(


Que faire si vous appelez le point de terminaison avec un navigateur - le fichier est-il téléchargé?



1
votes

Corrigé comme ceci:

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");

Fonctionne comme un charme maintenant. Sortie Swagger:

 entrez la description de l'image ici


0 commentaires

0
votes

Dans ASP.NetCore, nous avons return File (ret, "application / octet-stream", fileName);

Renvoyer un fichier avec le type dont nous avions besoin, dans mon cas pour un package .msi j'utilise "application / octet-stream" pour vous, vous pouvez soit spécifier le type de retour comme .CSV ici dans niveau contrôleur ou au niveau global dans la classe WebApiConfig pour Formatters


0 commentaires