Unicodeコンテンツ-ヘッダー処理
-
23-09-2019 - |
質問
を使用してい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で見つけることができます。
(この記事のようにバージョン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);