Excellente question... et qui mérite plus de détails. Je me retrouve ici à la suite d'une situation intéressante. Nous livrions des pièces jointes en pdf via l'environnement MVC3/C#. Notre code a été publié et nous avons commencé à recevoir des réponses de nos clients indiquant que les téléchargements se comportaient étrangement lorsqu'ils utilisaient Chrome et que le type de fichier était converti en "pdf-, attachment.pdf-, attachment". Ouaip... vous l'avez compris... tout ça. On peut donc le réécrire pour qu'il ne soit plus que "pdf" et que le fichier soit enregistré intact, mais quel gâchis !
Donc, pour décrire la situation initiale, nous définissions l'en-tête "Content-Disposition" et retournions un FileContentResult...
var cd = new System.Net.Mime.ContentDisposition
{
FileName = result.Attachment.FileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);
Ça semblait bon. Ça marchait bien dans IE. J'ai donc fait quelques recherches et j'ai essayé d'implémenter FileStreamResult à la place (en gardant le setter Content-Disposition) :
MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));
Le problème a été résolu dans Chrome ! Hmmm... mais pourquoi diable devrais-je prendre mon tableau d'octets, le streamer et le renvoyer via ceci pour que le nom du fichier fonctionne correctement ?
Puis vint le violoniste.
Avec FileContentResult, j'ai obtenu 2 Content-Dispositions dans l'en-tête. Avec FileStreamResult, j'ai obtenu 1.
FileContentResult ajoute un en-tête Content-Disposition lorsqu'il fournit le nom du fichier et Chrome considère les multiples de cet en-tête comme une erreur.
Une réaction étrange... mais certainement une qu'il est bon de savoir.