Ottima domanda ... e merita maggiori dettagli. Mi trovo qui come risultato di una situazione interessante. Fornivamo alcuni allegati pdf tramite l'ambiente MVC3 / C #. Il nostro codice è stato rilasciato e abbiamo iniziato a ricevere alcune risposte dai nostri clienti sul fatto che i download si stavano comportando in modo strano quando utilizzavano Chrome e il tipo di file veniva convertito in "pdf- ,legato.pdf-, allegato". Sì ... hai capito ... tutto. Quindi, si potrebbe riscriverlo in 'pdf' e il file verrebbe comunque salvato intatto, ma che casino!
Quindi, per descrivere la situazione iniziale, stavamo impostando l'intestazione "Content-Disposition", quindi restituendo 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);
Sembrava buono. Ha funzionato bene in IE. Quindi ho fatto qualche ricerca e ho provato ad implementare FileStreamResult (mantenendo il 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));
Risolto il problema in Chrome! Hmmm ... ma perché diamine dovrei prendere il mio array di byte perfettamente funzionante e trasmetterlo in streaming e poi restituirlo tramite questo per far funzionare correttamente il nome del file?
Poi venne il violinista.
Con FileContentResult, ho ottenuto 2 disposizioni di contenuto nell'intestazione. Con FileStreamResult, ho ottenuto 1.
FileContentResult aggiunge un'intestazione Content-Disposition quando fornisce il Nome file e Chrome considera i multipli di questa intestazione come un errore.
Strana reazione ... ma sicuramente una buona da sapere.
System.Web.MimeMapping.GetMimeMapping(filename)
per raccogliere il tipo mime se non riesci ad accedervi facilmente.