すばらしい質問です...そして詳細に値します。面白い状況の結果、私はここにいます。MVC3 / C#環境を介していくつかのPDF添付ファイルを配信していました。コードがリリースされ、クライアントがChromeを使用していて、ファイルの種類が「pdf-、attachment.pdf-、添付ファイル」に変換されているときに、ダウンロードが異常な動作をしているという応答をクライアントから受け取り始めました。うん...あなたはそれを手に入れました...全部。したがって、それを単に「pdf」に書き換えても、ファイルはそのまま保存されますが、なんとめちゃくちゃなのでしょう。
したがって、初期状態を説明するために、「Content-Disposition」ヘッダーを設定してから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);
良さそうだ。IEで問題なく動作しました。そこで、私はいくつかの調査を行い、代わりにFileStreamResultを実装しようとしました(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));
Chromeの問題を修正しました。うーん...でも、なぜ私は完全に優れたバイト配列を取得してストリーミングし、これを介して返さなければならないのですか?
それからフィドラーがやってきた。
FileContentResultを使用して、ヘッダーに2つのContent-Dispositionを取得しました。FileStreamResultを使用して、1を取得しました。
FileContentResultは、ファイル名を提供するときにContent-Dispositionヘッダーを追加し、Chromeはこのヘッダーの倍数をエラーと見なします。
奇妙な反応...しかし、間違いなく知っておくべきことです。
System.Web.MimeMapping.GetMimeMapping(filename)
以降では、簡単にアクセスできない場合にMIMEタイプを収集するために使用できます。