2

Controller.File(Stream fileStream, String contentType, String fileDownloadName)メソッドを使用して、サーバーからファイルをダウンロードします。私の場合contentTypeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet. fileDownloadName引数でファイルに特別な名前を指定します。また、Firefox、Opera、IE9 でうまく動作します。

ただし、IE8 は、指定した名前ではなく、アクションの名前を返します。Download.xlsxURLがの場合、のように見えます../Report/Download

それはなぜですか?


.NET の Content-Disposition ヘッダーによると、私が使用しているオーバーロードは問題を解決するはずです。ただし、IE8 では、ファイルのダウンロード名をエンコードする必要があります。一方、HttpUtility.UrlPathEncodeたとえばでエンコードすると、Firefox はエンコードされたファイル名を表示し始めます。

結局、普遍的な解決策はありますか?

4

2 に答える 2

2

少なくとも IE8+ と Mozilla のファイル ダウンロード名を提供する一般的な方法を見つけられなかったので、一時的な回避策として次の方法を使用します。

Stream report = GetReport();
string filename = GetFileName();
if (Request.Browser.Browser.Equals("IE", StringComparison.CurrentCultureIgnoreCase))
    filename = HttpUtility.UrlPathEncode(filename);

return File(
    report, 
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
    filename);

エンコードされたファイル名は、Firefox によって正しく表示されませんでした。エンコードされていない - IE8 による。現在の文化はであるRuため、ファイル名にはキリル記号が含まれています。これは、IE8 (およびおそらくスペース) の問題のようです。


ASP.Net MVC 3でファイルのダウンロード名を提供するための正しいおよび/または逆の(もしあれば)アプローチにつながる可能性のある提案を受け入れます。それまでは、この貧弱な回避策を答えとして受け入れます。仕事をします。

于 2013-04-02T01:09:32.473 に答える
0
 Response.AppendHeader("content-disposition", "attach;filename=" + fileName);

 return File(fileStream, contentType);

「アタッチ;」の変更 「インライン;」に ファイルの保存を求めるブラウザの代わりに、ファイルがブラウザで開かれます。

注: ブラウザとファイル名の値に関する問題も経験しています。非 ASCII 文字、スペース、および句読点が原因で、このヘッダーがブラウザに無視される可能性があります (ファイル名に「;」または「#」を含むファイルをダウンロードすると、ファイル名が失われます)。

于 2013-04-01T14:36:07.897 に答える