Gute Frage ... und verdient mehr Details. Ich befinde mich hier aufgrund einer interessanten Situation. Wir haben einige PDF-Anhänge über die MVC3 / C # -Umgebung bereitgestellt. Unser Code wurde veröffentlicht und wir erhielten einige Antworten von unseren Kunden, dass sich die Downloads bei Verwendung von Chrome merkwürdig verhalten und der Dateityp in "pdf-, Anhang.pdf-, Anhang" konvertiert wurde. Yup ... du hast es ... die ganze Sache. Man könnte es also so umschreiben, dass es nur "pdf" ist und die Datei immer noch intakt gespeichert wird, aber was für ein Durcheinander!
Um die anfängliche Situation zu beschreiben, haben wir den Header 'Content-Disposition' gesetzt und dann ein FileContentResult zurückgegeben ...
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);
Schien gut zu sein. Hat im IE gut funktioniert. Also habe ich einige Nachforschungen angestellt und versucht, stattdessen FileStreamResult zu implementieren (wobei der Content-Disposition-Setter beibehalten wurde):
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));
Es hat das Problem in Chrome behoben! Hmmm ... aber warum zum Teufel sollte ich mein perfektes Byte-Array nehmen und es streamen und dann über dieses zurückgeben müssen, damit der Dateiname richtig funktioniert?
Dann kam der Geiger.
Mit FileContentResult habe ich 2 Content-Dispositionen im Header. Mit FileStreamResult habe ich 1 bekommen.
FileContentResult fügt einen Content-Disposition-Header hinzu, wenn der Dateiname angegeben wird, und Chrome betrachtet Vielfache dieses Headers als Fehler.
Seltsame Reaktion ... aber definitiv eine, die gut zu wissen ist.
System.Web.MimeMapping.GetMimeMapping(filename)
den MIME-Typ erfassen, wenn Sie nicht einfach darauf zugreifen können.File
Ergebnis einen Dateinamen geben , müssen Sie dessenFileDownloadName
Eigenschaft festlegen, wodurch dieContent-Disposition
Header für Sie festgelegt werden. Und es unterstützt die utf-8-Dateinamen korrekt, was derContentDisposition
Klasse nicht hilft (siehe meinen Kommentar hier für weitere Details).