質問

を使用していHttpContextオブジェクトを実施HttpHandler子のダウンロードファイルをいただいた場合、非ascii文字をファイル名ですか、IEがで微細に達しています。

以下のコード:-

       context.Response.ContentType = ".cs";
context.Response.AppendHeader("Content-Length", data.Length.ToString());
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}",filename));
        context.Response.OutputStream.Write(data, 0, data.Length);

context.Response.Flush();

時給'ß''ä''ö''ü''Ã3''ß''ä''ö''ü''Ã3'ファイル名フィールドで異なるようにしているファイル名で微細に達しています。追加EncodingTypeおよび文字セットをどのように使い分けられているの。

IeではÃÅ''ä''ö''ü''ó''ß''ä''ö''ü'_'ÃÂ3'やfirefoxではß''ä''ö''ü''Ã3''ß''ä''ö''ü''Ã3'.

うさせること固定ですか。

役に立ちましたか?

解決

また同様の問題です。ただし、使用 HttpUtility.UrlEncode または サーバーです。UrlEncode へのエンコードファイル名を指定します。もっfirefoxの必要がなかったためです。Moreoverit荒廃したファイル名の場合でurlエンコードされます。私のコード:

// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care
if (Request.Browser.IsBrowser ("IE"))
{
    fileName = Server.UrlEncode(fileName);
}

Response.Clear ();
Response.AddHeader ("content-disposition", String.Format ("attachment;filename=\"{0}\"", fileName));
Response.AddHeader ("Content-Length", data.Length.ToString (CultureInfo.InvariantCulture));
Response.ContentType = mimeType;
Response.BinaryWrite(data);

編集

している仕様である。まず RFC2183 国:

現在の[RFC2045]文法の制限パラメータの値がContent-Dispositionファイル名)をUS-ASCII.

しか参照する[RFC2045"がabsoleteとなければな参照 RFC2231, る国:

星印("*")を再利用を提供 の指標と言語 文字セット情報が存在す -エンコードを使っています。単一の 引用符("')を使用して境界を定 文字セットと言語情報 初のパラメータ 値とします。%標識("%")を使用してい のエンコードフラグとよく一致し RFC2047.

ることで利用UrlEncode非asciiシンボルとして長きにエンコードに記載された rfc.以下に例を示します。

string.Format("attachment; filename=\"{0}\"; filename*=UTF-8''{0}", Server.UrlEncode(fileName, Encoding.UTF8));

ご注意 filename が含まれま filename* 下位互換性を維持するため.選択することも可能です。別のエンコードを変更したパラメータに従って、UTF-8のカバーです。

他のヒント

HttpUtility.UrlPathEncodeは良いオプションかもしれません。 URLENCODEは '+' 記号で、スペースに置き換えられますようます。

私にとってこのソリューションでは、すべての主要なブラウザ:

Response.AppendHeader("Content-Disposition", string.Format("attachment; filename*=UTF-8''{0}", HttpUtility.UrlPathEncode(fileName).Replace(",", "%2C"));
var mime = MimeMapping.GetMimeMapping(fileName);
return File(fileName, mime);

を使用ASP.NET MVC3.

の交換が必要なため、クロムさんのようにコンマ(,)でパラメータ値: http://www.gangarasa.com/lets-Do-GoodCode/tag/err_response_headers_multiple_content_disposition/

とい RFC6266 の顔を見てください。試験 http://greenbytes.de/tech/tc2231/.

私にとって、これは問題を解決しました

var result = new HttpResponseMessage(HttpStatusCode.OK)
{
   Content = new ByteArrayContent(data)
};

result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileNameStar = "foo-ä-€.html"
};

私はシオマネキで広告repsonseを見たとき、私は、ファイル名がautomaticcaly UTF-8でエンコードされた見ることができます:

を 符号化されたコンテンツの廃棄と

フィドラー応答の例はの 我々はコンテンツディスポジションヘッダーの値を見れば、

我々はそれが@Johannesガイヤー彼の答えと同じになります見ることができます。唯一の違いは、我々はエンコーディングourselfsを行うには持っていなかったということです、ContentDispositionHeaderValueクラスがそのの世話をする。

私はコンテンツの廃棄ヘッダーのテストケースを使用した: http://greenbytes.de/tech/ tc2231 / のジュリアンReschkeで述べたように。 ContentDispositionHeaderValueクラスに関する情報は、MSDNで見つけることができます。

:Asp.Netコアの

(この記事のようにバージョン2)UrlPathEncodeが廃止されましたが、ここで所望の結果を達成する方法を説明します

System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
{
   FileName = Uri.EscapeUriString(fileName),
   Inline = true  // false = prompt the user for downloading;  true = browser to try to show the file inline
};

Response.Headers.Add("Content-Disposition", cd.ToString());

I`mそれら進表現に変換するためのすべての文字をUri.EscapeUriStringを使用して、およびUnicode正規化フォームCのstring.Normalize (ASP.NET MVC5フレームワーク4.5で試験)

    var contentDispositionHeader = new System.Net.Mime.ContentDisposition
    {
        Inline = false,
        FileName = Uri.EscapeUriString(Path.GetFileName(pathFile)).Normalize()
    };
    Response.Headers.Add("Content-Disposition", contentDispositionHeader.ToString());
    string mimeType = MimeMapping.GetMimeMapping(Server.MapPath(pathFile));
    return File(file, mimeType);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top