11

HttpHandler の子に実装された HttpContext オブジェクトを使用してファイルをダウンロードしています。ファイル名に非ASCII文字が含まれていると、IEでは奇妙に見えますが、Firefoxではうまく見えます。

以下はコードです: -

       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();

ファイル名フィールドに 'ß' 'ä' 'ö' 'ü' 'ó' 'ß' 'ä' 'ö' 'ü' 'ó' を指定すると、ファイルにあるものとは異なって見えます名前はfirefoxでうまく見えます。EncodingType と charset を追加しても役に立ちません。

つまり、'ß' 'Ãâ¤' 'ö' 'ü' 'ó' 'ß' 'Ãâ¤' 'ö' 'ü'_'ó' であり、firefox では 'ß' ' です。 ä' 'ö' 'ü' 'ó' 'ß' 'ä' 'ö' 'ü' 'ó'.

これを修正する方法はありますか?

4

7 に答える 7

21

同様の問題がありました。ファイル名をエンコードするには、 HttpUtility.UrlEncodeまたはServer.UrlEncodeを使用する必要があります。また、Firefoxはそれを必要としなかったことを覚えています。さらに、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は次のように述べています。

現在の [RFC 2045] の文法では、パラメータ値 (したがって Content-Disposition ファイル名) が US-ASCII に制限されています。

しかし、その後、[RFC 2045] は廃止され、次のように述べているRFC 2231を参照する必要があるという参照を見つけました。

アスタリスク ("*") は、言語と文字セットの情報が存在し、エンコードが使用されていることを示すために再利用されます。単一引用符 ("'") は、パラメーター値の先頭で文字セットと言語情報を区切るために使用されます。パーセント記号 (「%」) は、RFC 2047 に準拠したエンコード フラグとして使用されます。

つまり、 rfcに記載されているエンコーディングを含める限り、ASCII 以外のシンボルに UrlEncode を使用できます。以下に例を示します。

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

後方互換性のためfilenameに に加えて が含まれていることに注意してください。filename*別のエンコーディングを選択して、それに応じてパラメーターを変更することもできますが、UTF-8 がすべてをカバーします。

于 2010-03-30T08:27:39.827 に答える
2

RFC 6266を読み、 http://greenbytes.de/tech/tc2231/でテストを確認することをお勧めします。

于 2012-05-02T18:47:31.750 に答える
2

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

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

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

フィドラーで応答を見ると、ファイル名がUTF-8を使用して自動的にエンコードされていることがわかります。

UTF-8 を使用してエンコードされた Content-Disposition ファイル名を使用した Fiddler 応答の例

Content-Disposition ヘッダーの値を見ると、@Johannes Geyer の回答と同じであることがわかります。唯一の違いは、自分でエンコーディングを行う必要がなかったことです。ContentDispositionHeaderValue クラスがそれを処理します。

Julian Reschke が述べたように、http ://greenbytes.de/tech/tc2231/ の Content-Disposition ヘッダーにテストケースを使用しました。ContentDispositionHeaderValue クラスに関する情報は、MSDN で見つけることができます。

于 2017-10-20T09:31:23.140 に答える
0

Asp.Net Core (この記事の時点でバージョン 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());
于 2018-04-25T21:41:48.707 に答える