HTTPでContent-Dispositionヘッダーのファイル名パラメーターをエンコードする方法


535

Web ブラウザーで直接レンダリングするのではなく、リソースを強制的にダウンロードしたいWebアプリケーションは、フォームのHTTP応答でヘッダーを発行します。Content-Disposition

Content-Disposition: attachment; filename=FILENAME

filenameパラメータは、リソースは、ブラウザによってダウンロードされているにファイルの名前を提案するために使用することができます。ただし、RFC 2183(Content-Disposition)では、セクション2.3(ファイル名パラメーター)で、ファイル名はUS-ASCII文字のみを使用できると述べています。

現在の[RFC 2045]文法は、パラメーター値(およびContent-Dispositionファイル名)をUS-ASCIIに制限しています。ファイル名に任意の文字セットを許可することは非常に望ましいことですが、必要なメカニズムを定義することはこのドキュメントの範囲を超えています。

それにもかかわらず、今日最も人気のあるWebブラウザーが非US-ASCII文字をまだ許可しているように見えるという経験的証拠があります(標準がないため)、ファイル名のエンコードスキームと文字セットの仕様に同意しません。次に、ファイル名「naïvefile」(引用符なし、3番目の文字がU + 00EFの場合)をContent-Dispositionヘッダーにエンコードする必要がある場合、人気のあるブラウザーで採用されているさまざまなスキームとエンコーディングは何ですか。

この質問のために、一般的なブラウザは次のとおりです。

  • Firefox
  • インターネットエクスプローラ
  • サファリ
  • グーグルクローム
  • オペラ

Mobile Safari(@MartinØrding-Thomsenの提案による生のutf-8)では機能しますが、同じデバイスのGoodReaderでは機能しません。何か案は?
Thilo


1
パスの最後のセグメントを設定できれば、Kornelの答えは最も抵抗の少ないパスであることがわかりました。これをと組み合わせてくださいContent-Disposition: attachment
Antti Haapala 2016

回答:


94

ブラウザーのテストや下位互換性へのリンクを含む、これについての議論は、提案されたRFC 5987の「ハイパーテキスト転送プロトコル(HTTP)ヘッダーフィールドパラメーターの文字セットと言語エンコード」にあります。

RFC 2183は、そのようなヘッダーはRFC 2184に従ってエンコードする必要があることを示しています。これは、RFC 2231によって廃止され、上記のドラフトRFCによってカバーされました。


5
また、インターネットドラフト(「ドラフトRFC」ではない)が完成し、最終的なドキュメントがRFC 5987(greenbytes.de/tech/webdav/rfc5987.html)であることにも注意してください
Julian Reschke

11
これに関連して、ファイル名にコンマ(、)があると、Firefox(バージョン4〜9を含む)が壊れることを発見しましたContent-Disposition: filename="foo, bar.pdf"。その結果、Firefoxはファイルを正しくダウンロードしますが、.part拡張子は保持します(例:)foo,bar.pdf-1.part。その場合、もちろん、アプリケーションがに関連付けられていないため、ファイルは正しく開きません.part。他のASCII文字は問題なく動作するようです。
catchdave 2012年

3
IEの動作の詳細については、blogs.msdn.com
b /

5
@catchdave:「添付ファイル」を忘れました。部。
ChristofferHammarström14年

6
全体として、これは74票のリンクのみの回答にすぎません。
Antti Haapala 2016

364

私はこれが古い記事であることを知っていますが、それでもなお非常に関連があります。私は最近のブラウザーがrfc5987をサポートしていることを発見しました。これにより、utf-8エンコード、パーセンテージエンコード(urlエンコード)が可能になります。次に、ナイーブfile.txtは次のようになります。

Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt

Safari(5)はこれをサポートしていません。代わりに、utf-8エンコードされたヘッダーに直接ファイル名を書き込むというSafari標準を使用する必要があります。

Content-Disposition: attachment; filename=Naïve file.txt

IE8以前はそれもサポートしておらず、utf-8エンコードのIE標準を使用する必要があります。

Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt

ASP.Netでは、次のコードを使用します。

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
    contentDisposition = "attachment; filename=" + fileName;
else
    contentDisposition = "attachment; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

IE7、IE8、IE9、Chrome 13、Opera 11、FF5、Safari 5を使用して上記をテストしました。

2013年11月の更新

これが私が現在使用しているコードです。IE8をサポートする必要があるため、最初の部分を取り除くことはできません。Android上のブラウザーは組み込みのAndroidダウンロードマネージャーを使用しており、標準的な方法でファイル名を確実に解析できないことがわかりました。

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
    contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(fileName) + "\"";
else
    contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

上記は現在、IE7-11、Chrome 32、Opera 12、FF25、Safari 6でテストされており、ダウンロードには次のファイル名を使用しています。 ^〜 '-_、;。txt

IE7では、一部の文字では機能しますが、すべてでは機能しません。しかし、誰が最近IE7を気にしていますか?

これは、Android用の安全なファイル名を生成するために使用する関数です。Androidでサポートされている文字はわかりませんが、これらが確実に機能することをテストしました。

private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
    char[] newFileName = fileName.ToCharArray();
    for (int i = 0; i < newFileName.Length; i++)
    {
        if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
            newFileName[i] = '_';
    }
    return new string(newFileName);
}

@TomZ:IE7とIE8でテストしたところ、アポストロフィ( ')をエスケープする必要がないことがわかりました。失敗する例はありますか?

@Dave Van den Eynde:RFC6266に従って2つのファイル名を1行に結合すると、AndroidとIE7 + 8を除いて機能し、これを反映するようにコードを更新しました。提案ありがとうございます。

@Thilo:GoodReaderや他のブラウザ以外については何も考えません。Androidのアプローチを使用すると、運が良いかもしれません。

@Alex Zhukovskiy:理由はわかりませんが、Connectで説明したように、うまく機能しないようです。


1
Mobile Safari(上記のように生のutf-8)で機能しますが、同じデバイスのGoodReaderでは機能しません。何か案は?
Thilo

1
IE7と8にもアポストロフィをエスケープする必要があります:.Replace( "'"、Uri.HexEscape(' \ ''))
TomZ

1
UTF-8文字を直接書き込むことは、Firefox、Chrome、およびOperaの現在のバージョンで機能するようです。SafariとIEをテストしませんでした。
Martin Tournoij 2013年

20
それらを組み合わせて、Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txtブラウザのスニッフィングをスキップしてみませんか?それはうまくいくでしょうか?
Dave Van den Eynde 2013年

9
fastmailの親切な人々は別の回避策を見つけました:blog.fastmail.com/2011/06/24/download-non-english-filenames Content-Disposition:attachment; filename = "foo-%c3%a4.html"; filename * = UTF-8''foo-%c3%a4.html fileNameを2回指定すると(UTF-8接頭辞なしで1回と使用して1回)、IE8-11、Edge、Chrome、Firefox、Safari(アップルの固定サファリのように見えるので、今でも同様に機能します)
wullinkm

169
  • で非ASCII名をエンコードする相互運用可能な方法はありませんContent-Dispositionブラウザの互換性はめちゃくちゃです。

  • でUTF-8を使用するための理論的に正しい構文Content-Dispositionは非常に奇妙です:(filename*=UTF-8''foo%c3%a4はい、それはアスタリスクであり、中央に空の単一引用符を除いて引用符はありません)

  • このヘッダーはちょっと標準ではありません(HTTP / 1.1仕様はその存在を認めていますが、クライアントがそれをサポートすることを要求していません)。

シンプルで非常に堅牢な代替手段があります。必要なファイル名を含むURLを使用してください

最後のスラッシュの後の名前が必要な場合は、追加のヘッダーは必要ありません。

このトリックは機能します:

/real_script.php/fake_filename.doc

サーバーがURLの書き換えをサポートしている場合(mod_rewriteApacheなど)、スクリプト部分を完全に非表示にすることができます。

URLの文字はUTF-8で、バイトごとにURLエンコードされている必要があります。

/mot%C3%B6rhead   # motörhead

3
GetAttachment.aspx / fake_filename.doc?id = 34を試してください(Apacheのみの癖かもしれませんが)
Kornel

2
これは素晴らしいソリューションです。本当に私を助けてくれました。ありがとう。
kristopolous 2011

6
私はうさぎの道を下り、他の解決策をいくつか試しました。ヘッダーを正しく設定するために適切なブラウザーとバージョンを見つけ出すのは、あまりにも悪夢です。Chromeは、まったく同じように動作しないSafariとして誤って識別していました(正しくエンコードされていないと、カンマで中断されます)。トラブルを回避し、このソリューションを使用して、必要に応じてURLのエイリアスを作成します。
mpen 2013

3
/:id/:filenameこの方法は本当に簡単で、作品は、ありがとうございました!
Luca Steeb、2015年

2
千回「はい」。これで真剣に時間を稼ぐでしょう。さらに均一-一部のAndroidブラウザーは無視して無視しContent-Disposition代わりに非常に興味深いファイル名を作成します(パスから生成されます)。自分の正気を保つための唯一の解決策は、単に設定されるので、Content-Disposition: attachment最後のパスコンポーネントとして所望のファイル名を渡すと:
Julik

73

RFC 6266は、「ハイパーテキスト転送プロトコル(HTTP)でのContent-Dispositionヘッダーフィールドの使用」について説明しています。それから引用:

6.国際化に関する考慮事項

[ RFC 5987 ]で定義されているエンコーディングを使用する“ filename*”パラメータ(セクション4.3)により、サーバーはISO-8859-1文字セット外の文字を送信し、使用する言語をオプションで指定することもできます。

そして、その例のセクションでは

この例は上記と同じですが、RFC 5987を実装しいないユーザーエージェントとの互換性のために "filename"パラメータを追加しています 。

Content-Disposition: attachment;
                     filename="EURO rates";
                     filename*=utf-8''%e2%82%ac%20rates

注:RFC 5987エンコードをサポートしないユーザーエージェントfilename*は、「filename」の後に「」が続く場合、「」を無視します。

では、付録Dの相互運用性を高めるための提案の長いリストもあります。また、実装を比較するサイトも指しています。一般的なファイル名に適した現在のオールパステストは次のとおりです。

  • attwithisofnplain:二重引用符が付いた、エンコードなしのプレーンISO-8859-1ファイル名。これには、すべてISO-8859-1であり、少なくとも16進数字の前にパーセント記号を含まないファイル名が必要です。
  • attfnboth:上記の順序の2つのパラメーター。IE8は「filename」パラメーターを使用しますが、ほとんどのブラウザーのほとんどのファイル名で機能するはずです。

そのRFC 5987は、実際の形式を説明するRFC 2231を次に参照します。2231は主にメール用で、5987はHTTPヘッダーに使用できる部分も示しています。これを、RFC 2388(特にセクション4.4)およびHTML 5ドラフトによって管理されいるmultipart/form-dataHTTP 本文内で使用されるMIMEヘッダーと混同しないでください。


1
Safariで問題が発生しました。ロシア語の名前のファイルをダウンロードすると、誤った読み取り不可能な文字が表示されました。ソリューションが役立ちました。ただし、ヘッダーを1行で送信する必要があります(!!!)。
evtuhovdo

16

ジムが回答で言及したRFCドラフトからリンクされている次のドキュメントは、さらに質問を扱っており、ここで直接メモする価値があります。

HTTP Content-DispositionヘッダーとRFC 2231/2047エンコーディングのテストケース


filenameパラメータをエンコードする両方の方法を提供でき、古いブラウザと新しいブラウザ(この場合はMSIE8とSafari)で正しく動作するように見えることに注意してください。@AtifAzizが言及したレポートのattfnbothを確認してください。
Pablo Montilla

11

asp.net mvc2では、次のようなものを使用します。

return File(
    tempFile
    , "application/octet-stream"
    , HttpUtility.UrlPathEncode(fileName)
    );

mvc(2)を使用しない場合は、次のコマンドを使用してファイル名をエンコードできます。

HttpUtility.UrlPathEncode(fileName)

2
ファイル名エンコーディングのURLエンコーディングは無効です。ブラウザはそれらをURLデコードしないでください。
SerialSeb 2011

IE 11はこのフィールドのURLエンコードを確実にデコードしません。
疑似コーダー2015年

ただし、ブラウザがChromeまたはIEの場合はUrlEncodedである必要があり、FF、Safari、Operaなどはエンコードなしで問題なく動作します
Reza

11

ファイル名を二重引用符で囲みます。私のために問題を解決しました。このような:

Content-Disposition: attachment; filename="My Report.doc"

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

複数のオプションをテストしました。ブラウザーは仕様をサポートしておらず、動作が異なります。二重引用符が最良のオプションだと思います。


3
悲しいことに、これは上記の回答で説明されているすべての問題を解決するわけではありません。
Luca Steeb 2016年

2
これはあなたがスペースで、ファイル名を返すことができるようになります&%#それはそれを解決しますのでなど。
Don Cheadle

ファイル名に二重引用符が含まれている場合(そうなる可能性があります)、RFC 6266で指定されているように、ファイル名は「引用文字列」であり、RFC 2616で指定されているように、引用文字列内の二重引用符はバックスラッシュでエスケープする必要があります。
Christophe Roussy

10

エンコードには次のコードスニペットを使用します(fileNameにファイルのファイル名と拡張子が含まれていると仮定します:test.txt):


PHP:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $fileName ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $fileName ) );
}

Java:

fileName = request.getHeader ( "user-agent" ).contains ( "MSIE" ) ? URLEncoder.encode ( fileName, "utf-8") : MimeUtility.encodeWord ( fileName );
response.setHeader ( "Content-disposition", "attachment; filename=\"" + fileName + "\"");

右、それがなければならないrawurlencodeため、少なくともPHPにfilename*=のでdispositionヘッダvalue-charsで使用されるext-valueRFC 6266-の> RFC 5987は、(参照tools.ietf.org/html/rfc6266#section-4.1tools.ietf.org/html/rfc5987#section -3.2.1)はfilename=、パーセントエスケープなしではスペースを許可しません(一方、ここでは、ASCIIのみが存在する必要がありますが、エスケープなしでスペースを許可できるようです)。rawurlencodeの完全な厳密性でエンコードする必要はないため、いくつかの文字をエスケープ解除
Brett

9

ASP.NET Web APIでは、ファイル名をURLエンコードします。

public static class HttpRequestMessageExtensions
{
    public static HttpResponseMessage CreateFileResponse(this HttpRequestMessage request, byte[] data, string filename, string mediaType)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(data);
        stream.Position = 0;

        response.Content = new StreamContent(stream);

        response.Content.Headers.ContentType = 
            new MediaTypeHeaderValue(mediaType);

        // URL-Encode filename
        // Fixes behavior in IE, that filenames with non US-ASCII characters
        // stay correct (not "_utf-8_.......=_=").
        var encodedFilename = HttpUtility.UrlEncode(filename, Encoding.UTF8);

        response.Content.Headers.ContentDisposition =
            new ContentDispositionHeaderValue("attachment") { FileName = encodedFilename };
        return response;
    }
}

IE 9未修正
IE 9修正済み


5

次のコードを古いエクスプローラー(互換モード経由)を含むすべての主要なブラウザーでテストしましたが、どこでも問題なく機能します。

$filename = $_GET['file']; //this string from $_GET is already decoded
if (strstr($_SERVER['HTTP_USER_AGENT'],"MSIE"))
  $filename = rawurlencode($filename);
header('Content-Disposition: attachment; filename="'.$filename.'"');

5

このブログ投稿これらのテストケースに基づいて) "download.php"スクリプトに次のコードが含まれていました。

$il1_filename = utf8_decode($filename);
$to_underscore = "\"\\#*;:|<>/?";
$safe_filename = strtr($il1_filename, $to_underscore, str_repeat("_", strlen($to_underscore)));

header("Content-Disposition: attachment; filename=\"$safe_filename\""
.( $safe_filename === $filename ? "" : "; filename*=UTF-8''".rawurlencode($filename) ));

これは、iso-latin1と「安全な」文字のみが使用されている限り、filename = "..."の標準的な方法を使用します。そうでない場合は、filename * = UTF-8 ''のURLエンコード方法を追加します。この特定のテストケースによると、MSIE9以降、および最近のFF、Chrome、Safariでは動作するはずです。以前のMSIEバージョンでは、ファイル名のISO8859-1バージョンを含むファイル名を提供し、このエンコーディングに含まれない文字にアンダースコアを付ける必要があります。

最後の注意:最大 各ヘッダーフィールドのサイズは、Apacheでは8190バイトです。UTF-8は1文字あたり最大4バイトです。rawurlencodeの後は、x3 = 1文字あたり12バイトです。かなり非効率的ですが、ファイル名に600を超える「笑顔」%F0%9F%98%81を含めることは理論的には可能です。


...ただし、転送可能なファイル名の最大長もクライアントによって異なります。せいぜい[89smiles😁] .pdfファイル名がMSIE11を通過することがわかりました。Firefox37では、最大で[111x😁] .pdfです。Chrome41は110番目の笑顔でファイル名を切り捨てます。興味深いことに、サフィックスは問題なく転送されます。
apurkrt 2015

5

nodejsバックエンドを使用している場合は、ここで見つけた次のコードを使用できます

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" 
             + encodeRFC5987ValueChars(fileName);

function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            // so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

1
使用する方が良いencodeURI(str)。ファイル名に日付を含む例:encodeURIComponent('"Kornél Kovács 1/1/2016')=> "KornélKovács1%2F1%2F2016" vs. encodeURI('"Kornél Kovács 1/1/2016')=> " KornélKovács1/1 /2016"
gdibble

4

PHPではこれが私のためにそれをしました(ファイル名がUTF8でエンコードされていると仮定しています):

header('Content-Disposition: attachment;'
    . 'filename="' . addslashes(utf8_decode($filename)) . '";'
    . 'filename*=utf-8\'\'' . rawurlencode($filename));

IE8-11、FirefoxおよびChromeに対してテスト済み。
ブラウザがfilename * = utf-8を解釈できる場合は、ファイル名のUTF8バージョンを使用します。それ以外の場合は、デコードされたファイル名を使用します。ファイル名にISO-8859-1で表現できない文字が含まれている場合は、iconv代わりに使用することを検討してください。


3
このコードは質問に答えることがありますが、なぜまたはどのように質問に答えるについて追加のコンテキストを提供すると、長期的な価値が大幅に向上します。回答を編集して、説明を追加してください。
Toby Speight 2016年

2
おっと、上記のコードのみの回答は、そのような反対投票や批判はありませんでした。また、私はなぜその理由が十分によく回答されているを確認しました。IEはfilename * = utf-8を解釈しませんが、このスクリプトが提供するISO8859-1バージョンのファイル名が必要です。怠惰なPHP用の単純なコードを提供したかっただけです。
グスタフ

質問は言語固有ではなく、ヘッダーエンコーディングを実装する際に使用するRFCについての質問なので、これは反対票を投じたと思います。しかし、この回答に感謝します。PHPの場合、このコードは私の悩みを解消しました。
j4k3

ありがとうございました。この回答は質問に厳密に回答したわけではないかもしれませんが、まさに私が探していたものであり、Pythonでの問題の解決に役立ちました。
Lyndsy Simon

1
ユーザーがファイルの名前を制御できる場合、このコードは攻撃ベクトルとして使用できると確信しています。
Antti Haapala 2016

3

今日、お客様の問題に対応するためにこれらすべてを試してみたので、アップデートです

  • 日本語用に構成されたSafariを除いて、お客様がテストしたすべてのブラウザーは、filename = text.pdfで最適に機能しました。ここで、textは、URLエンコードなしでutf-8のASP.Net/IISによってシリアル化されたお客様の値です。何らかの理由で、英語用に構成されたSafariは、日本語の名前でutf-8のファイルを受け入れて適切に保存しますが、日本語用に構成された同じブラウザでは、解釈されずにutf-8文字でファイルを保存します。テストされた他のすべてのブラウザは、URLエンコーディングなしでエンコードされたファイル名utf-8で(言語設定に関係なく)最高/正常に動作するように見えました。
  • 私はRfc5987 / 8187を実装する単一のブラウザ見つけることができなかったすべてのを。最新のChrome、Firefoxビルド、IE 11、Edgeでテストしました。ヘッダーをfilename * = utf-8''texturlencoded.pdfだけで設定し、filename = text.pdfの両方で設定しようとしました。filename * = utf-8''texturlencoded.pdf。上記のいずれにおいても、Rfc5987 / 8187の機能の1つが正しく処理されているようには見えません。

これは良いアップデートです。試した特定のテストについて詳しく説明できますか?
ブラッド、

3

PHPフレームワークSymfony 4には$filenameFallbackがありHeaderUtils::makeDispositionます。詳細については、この関数を調べることができます。これは上記の回答に似ています。

使用例:

$filenameFallback = preg_replace('#^.*\.#', md5($filename) . '.', $filename);
$disposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename, $filenameFallback);
$response->headers->set('Content-Disposition', $disposition);

1

従来のASPソリューション

最近のほとんどのブラウザーはFilenameUTF-8今のところ渡しをサポートしていますが、FreeASPUpload.Net (サイトはもう存在せず、archive.orgへのリンクポイント)に基づいて使用するファイルアップロードソリューションの場合と同様に、バイナリは、ASCIIでサポートされていない文字に到達するまでUTF-8でエンコードされたデータを渡したときに、1バイトのASCIIエンコードされた文字列の読み取りに依存していました。

しかし、コードでバイナリを読み取ってUTF-8として解析するための解決策を見つけることができました。

Public Function BytesToString(bytes)    'UTF-8..
  Dim bslen
  Dim i, k , N 
  Dim b , count 
  Dim str

  bslen = LenB(bytes)
  str=""

  i = 0
  Do While i < bslen
    b = AscB(MidB(bytes,i+1,1))

    If (b And &HFC) = &HFC Then
      count = 6
      N = b And &H1
    ElseIf (b And &HF8) = &HF8 Then
      count = 5
      N = b And &H3
    ElseIf (b And &HF0) = &HF0 Then
      count = 4
      N = b And &H7
    ElseIf (b And &HE0) = &HE0 Then
      count = 3
      N = b And &HF
    ElseIf (b And &HC0) = &HC0 Then
      count = 2
      N = b And &H1F
    Else
      count = 1
      str = str & Chr(b)
    End If

    If i + count - 1 > bslen Then
      str = str&"?"
      Exit Do
    End If

    If count>1 then
      For k = 1 To count - 1
        b = AscB(MidB(bytes,i+k+1,1))
        N = N * &H40 + (b And &H3F)
      Next
      str = str & ChrW(N)
    End If
    i = i + count
  Loop

  BytesToString = str
End Function

クレジットは、ファイル名をBytesToString()機能include_aspuploader.aspさせることができた自分のコードから関数を実装することによって、純粋なASPファイルアップロードに行きUTF-8ます。


役立つリンク


-1

Webアプリケーションにも同様の問題があり、HTMLからファイル名を読み取り、<input type="file">それを新しいHTMLのurlエンコードされたフォームに設定することで終わりました<input type="hidden">。もちろん、一部のブラウザから返される「C:\ fakepath \」のようなパスを削除する必要がありました。

もちろん、これはOPの質問に直接答えるものではありませんが、他の人のための解決策になるかもしれません。


1
まったく別の問題。質問はダウンロードに関するもので、返信はアップロードに関するものです。
Oskar Berggren

-3

私は通常、ファイル名を(%xxで)URLエンコードし、すべてのブラウザで機能するようです。とにかくいくつかのテストを実行したい場合があります。


10
私はいくつかのテストを行いましたが、すべてのブラウザでそのように機能するわけではないため、質問です。:)
Atif Aziz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.