2

私の Web メール サーバーでは、ユーザーはメールから添付ファイルをダウンロードできます。

英語以外のファイル名を受け取ると、IE 8/9 ではテキストが壊れますが、Chrome/Firefox では問題なく表示されます。現在ダウンロードを処理しているコードは次のとおりです。

<%
    attachfile = request("file")%>
<%
    files = Split(attachfile,"\")
    Set fso = CreateObject("Scripting.FileSystemObject")

    Response.Clear
    'Response.CharSet="UTF-8" 
    Response.ContentType = "application/unknown"
    Response.AddHeader "Pragma", "no-cache"
    Response.AddHeader "Expires", "0"
    Response.AddHeader "Content-Transfer-Encoding", "binary"
    Response.AddHeader "Content-Disposition","attachment; filename = " & files(Ubound(files)) 

    Set objStream = Server.CreateObject("ADODB.Stream")
    objStream.Open

    objStream.Type = 1 
    objStream.LoadFromFile attachfile

    Response.BinaryWrite objStream.Read
    Response.Flush

    objStream.Close : Set objStream = nothing

    Set fso = Nothing
%>
</BODY>
</HTML>

そこで、クライアントのコンピューターに保存する前に文字列が UTF-8 で正しくエンコードされることを期待して、ファイル名が content-disposition で渡される方法を次のように変更しました。

Response.AddHeader "Content-Disposition","attachment; filename = " & Server.URLEncode(files(Ubound(files))) 

これで 1 つの問題は解決しましたが、2 つの新しい問題に直面しています ---

最初の問題は、IE 8/9 でファイルをダウンロードしたときにファイル名が壊れなくなりましたが、ファイル拡張子の末尾に奇妙な [1] または [2] が追加されることです。つまり、파일 1.docx があった場合、IE はドキュメントを 파일 1.docx[1] として保存します。

2 つ目の問題は、Chrome では、ブラウザが UTF-8 でエンコードされた文字列をそのまま受け取るため、파일%20%1.docx として保存されることです。ファイルの英語以外の部分は正しく表示されますが、空のスペースは Unicode 文字コード 20 として表示されることに注意してください。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

解決

Content-Disposition最もブラウザーと互換性のあるアプローチは、応答ヘッダーではなく、目的のファイル名を URL に入れることです。

例えば:

http://localhost/[webpage]/파일.docx

ユーザーが上記のリンクをクリックすると、正しいファイル名が保存されます。以下は IE 8 のものです。

IE 8 ファイルのダウンロード プロンプト

質問は次のようになります-上記の形式のURLをaspに認識させるにはどうすればよいですか? 答えは、URL リライターを使用することです。

  • IIS 7 以降の場合、Microsoft の公式の書き換えモジュールがあります。
  • IIS 6 の場合、Ionics Isapi Rewrite Filterの最新バージョン (2.x) を使用できます。Microsoftは、古い IIS バージョンに対してこれを推奨しています。
  • IIS 5 の場合、Ionics Isapi Rewrite Filterも使用できますが、(1.x) バージョンを使用する必要がある場合があります。古いバージョンをダウンロードするには、リンクの右側にある「その他のダウンロード」セクションを参照してください。ドキュメントは、どの IIS バージョンがどのバージョンのフィルターでサポートされているかについて一貫していないようです。

IIS 4 以前を使用している場合は、アップグレードすることを強くお勧めします。

URL リライタを使用した経験はあまりありませんが、Microsoft のリライタは十分に簡単に機能させることができました。user-friendlyウィザードを使用してルールを追加しました。

ユーザーフレンドリーなルールダイアログを追加

ルール自体は非常に簡単でした:

IIS 書き換えルールの設定

ご覧のとおり、書き換えるルールを作成しています

http://localhost/default2/foo.doc/
http://localhost/default2/foo.doc (also works)

http://localhost/default2.asp?f=foo.doc

Web ページ (default2.asp) が呼び出されると、url パラメータからファイル名を取得できますf

あなたの質問とは関係ありませんが、適切なユーザーだけがファイルリンク、つまりファイルにアクセスできるようにするために、認証を行うこともできます。

ソース

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

HTTPヘッダーのUTF8ファイル名をエンコードするには? (パイソン、ジャンゴ)

于 2013-01-24T18:47:11.587 に答える
1

スクリプト側の解決策としては、まず要求されたブラウザが Internet Explorer であるかどうかを処理する必要があります (おなじみですね)。
私はコメントで説明しようとしました。次の例も考慮して、すべての主要なブラウザーでテストしてください。

Sub AddDisposHdr(ByVal FileName)
    If InStr(Request.ServerVariables("HTTP_USER_AGENT"), "MSIE") Then 'Internet Explorer
        Dim FileExt
        If InStr(FileName, ".") > 1 And Len(FileName) > 2 Then 'handling files without extension
            'file extension. shouldn't be encoded to get rid of meaningless square brackets in file names
            FileExt = Mid(FileName, InStrRev(FileName, "."))
            FileName = Mid(FileName, 1, InStrRev(FileName, ".") - 1) 'file name without extension
            FileName = Replace(Server.URLEncode(FileName), "+", " ") 'urlencode + replace plus signs with spaces
            FileName = FileName & FileExt
        End If
        Response.AddHeader "Content-Disposition", "attachment; filename=""" & FileName & """"
    Else ' Not Internet Explorer
        'According to RFC 2231 @ http://tools.ietf.org/html/rfc2231#section-3
        Response.AddHeader "Content-Disposition", "attachment; filename*=UTF-8''" &  _ 
        Server.URLPathEncode(FileName) ' It's an undocumented method.
        'Server.UrlPathEncode is used specifically to encode path names.
        'Its difference from UrlEncode is encodes space as "%20" not "+" 
        'and it doesn't encode the following characters at all : $#!&*.+-/@:? but UrlEncode does.
    End If
End Sub

Response.ContentType = "application/x-download"
AddDisposHdr FileNames("こんにちは 1.zip")
Response.Write "1" 'something to output
于 2013-01-25T14:02:53.943 に答える