J'essaie de renvoyer un fichier dans un contrôleur ASP.NET Web API. Ce fichier est un fichier PDF généré dynamiquement enregistré dans un MemoryStream.Angular/Web API 2 renvoie un fichier non valide ou corrompu avec StreamContent ou ByteArrayContent
Le client (navigateur) reçoit le fichier avec succès, mais quand j'ouvre le fichier, je vois que toutes les pages sont totalement vides. Le fait est que si je prends le même MemoryStream et l'écris dans un fichier, ce fichier disque est affiché correctement, donc je suppose que le problème est lié au transfert de fichier via le Web.
Mon contrôleur ressemble à ceci:
[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);
memStream.Position = 0;
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(memStream.ToArray()); //OR: new StreamContent(memStream);
return result;
}
Juste pour essayer, si j'écris le flux sur le disque, il est affiché correctement:
[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);
memStream.Position = 0;
using (var fs = new FileStream("C:\\Temp\\test.pdf", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
memStream.CopyTo(fs);
}
return null;
}
Les différences sont les suivantes:
- PDF enregistré sur le disque: 34KB
- PDF transféré via le Web : 60KB
Si je compare les deux contenu des fichiers, les principales différences sont (!):
Sur la gauche est le PDF transféré via le web; sur la droite, le PDF enregistré sur le disque.
Y at-il un problème avec mon code? Peut-être quelque chose en rapport avec les encodages?
Merci!
Vous me battez à elle. :) si proche. Votez pour vous. – Nkosi
Désolé mais pas de chance :(Même résultat: 'memStream.GetBuffer()' renvoie un tableau ~ 64K byte, alors que 'memStream.ToArray()' renvoie un tableau ~ 34K byte ... – Adrian
Ne pas utiliser GetBuffer() comme il renvoie un tableau de taille fixe ... utilise ToArray(). –