3

簡単なファイルのアップロードとダウンロードのメカニズムを実装しました。ユーザーがファイル名をクリックすると、ファイルは次の HTTP ヘッダーとともにダウンロードされます。

HTTP/1.1 200 OK
Date: Tue, 30 Sep 2008 14:00:39 GMT
Server: Microsoft-IIS/6.0
Content-Disposition: attachment; filename=filename.doc;
Content-Type: application/octet-stream
Content-Length: 10754

日本語のファイル名にも対応しています。そのために、次の Java メソッドを使用してファイル名をエンコードします。

private String encodeFileName(String name) throws Exception{
    String agent = request.getHeader("USER-AGENT");
    if(agent != null && agent.indexOf("MSIE") != -1){ // is IE
        StringBuffer res = new StringBuffer();
        char[] chArr = name.toCharArray();
        for(int j = 0; j < chArr.length; j++){
            if(chArr[j] < 128){ // plain ASCII char
                if (chArr[j] == '.' && j != name.lastIndexOf("."))
                    res.append("%2E");
                else
                    res.append(chArr[j]);
            }
            else{ // non-ASCII char
                byte[] byteArr = name.substring(j, j + 1).getBytes("UTF8");
                for(int i = 0; i < byteArr.length; i++){
                    // byte must be converted to unsigned int
                    res.append("%").append(Integer.toHexString((byteArr[i]) & 0xFF));
                }
            }
        }
        return res.toString();
    }
    // Firefox/Mozilla
    return MimeUtility.encodeText(name, "UTF8", "B");
}

誰かが長いファイル名でうまく動作しないことに気付くまで、これまでのところうまくいきました。例: あああああああああああああああ2008.10.1あ.doc. 半角ドットの 1 つを半角アンダーラインに変更するか、最初の文字を削除すると、問題なく動作します。つまり、ドット文字の長さと URL エンコードに依存します。以下にいくつかの例を示します。

これは壊れています ( あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

これで問題ありません ( あああああああああああああああ2008_10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008_10%2E1%e3%81%82.doc;

これでもいいです ( あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

誰にも手がかりがありますか?

4

4 に答える 4

6

gmail では、ファイル名のエスケープ処理が若干異なります。ファイル名は引用符で囲まれ (二重引用符)、半角ピリオドは URL エスケープされません。このように、質問の長いファイル名は OK です。

Content-Disposition: attachment; filename="%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%822008.10.1%E3%81%82.doc"

ただし、ファイル名のバイト長にはまだ制限があります (明らかに IE のみ) (バグだと思います)。そのため、ファイル名が半角文字のみで構成されている場合でも、ファイル名の先頭は切り捨てられます。制限は約 160 バイトです。

于 2008-09-30T14:51:47.680 に答える
1

ここでの主な問題は、IE が関連する RFC (RFC2231) をサポートしていないことです。ポインターとテスト ケースを参照してください。さらに、IE で使用する回避策 (パーセントでエスケープされた UTF-8 を使用するだけ) には、いくつかの追加の問題があります。すべてのロケールで機能するとは限りません (私が思い出す限り、デフォルトではない URL で常に UTF-8 を使用するように IE が構成されていない限り、この方法は韓国では失敗します)。また、前述のように、長さの制限があります ( IE8 では修正されていると聞きましたが、まだ試していません)。

于 2009-05-01T09:47:47.157 に答える
-2

この問題は IE8 で修正されていると思います。IE 8 で動作することを確認しました。

于 2010-08-16T06:52:02.180 に答える