- - PR -
ダウンロードファイルの保存時に文字化け
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-31 10:27
おはようございます。nabeママです。台風近づいてきてすっごい風ですね。
またご教授願いたくて書き込みしました。 「multipart/form-data」で指定したファイルをアップロードして特定フォルダに保存。 ファイル名はDB(ACCESS97)にセット。 DBからファイル名を取得しファイルをダウンロードして保存する時、 ヘッダーにファイル名をセットして保存ダイアログボックスを表示しますが 日本語のファイル名が文字化けします。 でも、DBやフォルダに保存されたファイル名は文字化けしていません。 ダウンロードのソースは request.setCharacterEncoding("Shift_JIS"); String Getname = request.getParameter("name"); File InFile = new File("D:/DataFile/" + Getname); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment; filename=" + InFile.getName()); BufferedInputStream in = new BufferedInputStream(new FileInputStream(InFile)); BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); int x; while((x=in.read()) >= 0){ out.write(x); } in.close(); out.close(); です。(前後は略してます) ここの検索から下記のHPを参考に http://www.nihon-eng.co.jp/c-break/TechNote/tomcat/TCAT41_Inst.htm server.xmlやweb.xmlを設定しましたがだめです。 他にどこを設定すればいいのでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2003-06-01 10:28
とありますが、この部分は提示されたソースコードにありませんね。
ここのGetnameが、DBから取り出して直前のWebページに埋め込まれたファイル名だとすると、その埋め込みのときの文字エンコード指定にミスがあったのではないかと思います。 念のために、上記の String Getname = request.getParameter("name"); の直後で中身を見てみるといいかもしれません。 | ||||||||
|
投稿日時: 2003-06-02 12:05
おはようございます。へげもんさんレスありがとうございます。
この直後に以下を追加したところ正しく表示しました。 response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("InFile.getName() =" + InFile.getName()); ということは response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment; filename=" + InFile.getName()); がまずいということになるのでしょうか? | ||||||||
|
投稿日時: 2003-06-02 13:47
はじめまして、320です。
おそらく、ファイル名をシフトJISで変換してヘッダーに書いてやれば大丈夫ではないでしょうか。 このような感じで。 String attachName = InFile.getName(); String encodeAttachName = new String(attachName.getBytes("Shift_JIS"),"8859_1"); response.setHeader("Content-Disposition", "attachment;filename=\""+ encodeAttachName +"\""); 動作確認をしてないのではずしていたらすいません。 あまり自信がないのですが、ひょっとすると response.setContentType("text/html; charset=Shift_JIS"); でレスポンスのエンコード指定をしても ヘッダーの部分のエンコードはされないのかも知れません。 これは全然ちがっているかも知れないので、 話半分ぐらいで聞いておいてください。 | ||||||||
|
投稿日時: 2003-06-02 15:07
320さんありがとうございます。
ファイル名をシフトJISで変換してヘッダーに書きましたがだめでした。 試しに変換前と変換後の化けたファイル名は 正しいファイル名 :管理部回覧.xls シフトJISで変換前:邂。逅・Κ蝗櫁ヲァ.xls シフトJISで変換後:ツ甘・猟敖閉板嘉アツ猟・xls こんな風に違いました。(あまり関係ありませんが・・・) | ||||||||
|
投稿日時: 2003-06-02 16:40
確か、Content-Dispositionでマルチバイト文字をファイル名に指定することは、
RFCでは禁止されていたように思います。(ひょっとしたらマルチバイト文字ではなくて Shift_JISがだめだったのかも知れません。ちょっと記憶が曖昧です) 私の経験では、filenameに全角を指定した場合、サーバにApacheを使っていた 場合はうまくいき、とある商用のサーバを使った場合はファイル名が化けた ということがありました。(ブラウザはIE5.5でした) | ||||||||
|
投稿日時: 2003-06-03 10:33
gsgさんレスありがとうございます。 マルチバイト文字は禁止ですか・・・ 日本では当たり前にファイル名に使っている漢字なんですけどね・・・ WEB上でメールのやりとりをする場合、直接指定するとだめなら間接的にみなさんやっておられるということでしょうかね。 ちなみにサーバはApacheとTomcatを連携してますが、IE6.0もNN4.7もだめでした。 | ||||||||
|
投稿日時: 2003-06-03 11:05
こんにちは。ジェイです。
私も同じようなことをしています。 DBからファイル名を取得して特定のフォルダから中身を取得して転送しています。 String ContentType = "ファイルのContentType" + " charset=ISO-2022-JP"; res.setContentType(ContentType); String Prefix = "ファイル名"; String Suffix = "拡張子"; res.setHeader("Content-Disposition","attachment; filename="+ new String(Prefix.getBytes(),"latin1") + "." + Suffix); と無理やりやったらできましたよ。 Apacheは使ってませんでしたが・・・。 Tomcat4.1.xでやりました。 参考になればと思います。 | ||||||||
