- PR -

ダウンロードファイルの保存時に文字化け

投稿者投稿内容
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 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を設定しましたがだめです。


他にどこを設定すればいいのでしょうか?
よろしくお願いします。

へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-06-01 10:28
引用:

DBからファイル名を取得しファイルをダウンロードして保存する時、
ヘッダーにファイル名をセットして保存ダイアログボックスを表示しますが
日本語のファイル名が文字化けします。
でも、DBやフォルダに保存されたファイル名は文字化けしていません。


とありますが、この部分は提示されたソースコードにありませんね。
引用:

request.setCharacterEncoding("Shift_JIS");
String Getname = request.getParameter("name");
File InFile = new File("D:/DataFile/" + Getname);


ここのGetnameが、DBから取り出して直前のWebページに埋め込まれたファイル名だとすると、その埋め込みのときの文字エンコード指定にミスがあったのではないかと思います。
念のために、上記の
String Getname = request.getParameter("name");
の直後で中身を見てみるといいかもしれません。
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-06-02 12:05
おはようございます。へげもんさんレスありがとうございます。

引用:


request.setCharacterEncoding("Shift_JIS");
String Getname = request.getParameter("name");
File InFile = new File("D:/DataFile/" + Getname);




引用:


ここのGetnameが、DBから取り出して直前のWebページに埋め込まれたファイル名だとすると、その埋め込みのときの文字エンコード指定にミスがあったのではないかと思います。
念のために、上記の
String Getname = request.getParameter("name");
の直後で中身を見てみるといいかもしれません。



この直後に以下を追加したところ正しく表示しました。
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());
がまずいということになるのでしょうか?
320
会議室デビュー日: 2003/05/11
投稿数: 3
投稿日時: 2003-06-02 13:47
はじめまして、320です。

引用:


ということは
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment; filename=" + InFile.getName());
がまずいということになるのでしょうか?




おそらく、ファイル名をシフト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");
でレスポンスのエンコード指定をしても
ヘッダーの部分のエンコードはされないのかも知れません。
これは全然ちがっているかも知れないので、
話半分ぐらいで聞いておいてください。
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-06-02 15:07
320さんありがとうございます。

ファイル名をシフトJISで変換してヘッダーに書きましたがだめでした。
試しに変換前と変換後の化けたファイル名は

正しいファイル名 :管理部回覧.xls
シフトJISで変換前:邂。逅・Κ蝗櫁ヲァ.xls
シフトJISで変換後:ツ甘・猟敖閉板嘉アツ猟・xls

こんな風に違いました。(あまり関係ありませんが・・・)

gsg
常連さん
会議室デビュー日: 2002/08/09
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2003-06-02 16:40
確か、Content-Dispositionでマルチバイト文字をファイル名に指定することは、
RFCでは禁止されていたように思います。(ひょっとしたらマルチバイト文字ではなくて
Shift_JISがだめだったのかも知れません。ちょっと記憶が曖昧です)
私の経験では、filenameに全角を指定した場合、サーバにApacheを使っていた
場合はうまくいき、とある商用のサーバを使った場合はファイル名が化けた
ということがありました。(ブラウザはIE5.5でした)

nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-06-03 10:33
引用:

gsgさんの書き込み (2003-06-02 16:40) より:
確か、Content-Dispositionでマルチバイト文字をファイル名に指定することは、
RFCでは禁止されていたように思います。(ひょっとしたらマルチバイト文字ではなくて
Shift_JISがだめだったのかも知れません。ちょっと記憶が曖昧です)
私の経験では、filenameに全角を指定した場合、サーバにApacheを使っていた
場合はうまくいき、とある商用のサーバを使った場合はファイル名が化けた
ということがありました。(ブラウザはIE5.5でした)



gsgさんレスありがとうございます。

マルチバイト文字は禁止ですか・・・
日本では当たり前にファイル名に使っている漢字なんですけどね・・・
WEB上でメールのやりとりをする場合、直接指定するとだめなら間接的にみなさんやっておられるということでしょうかね。
ちなみにサーバはApacheとTomcatを連携してますが、IE6.0もNN4.7もだめでした。




ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 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でやりました。

参考になればと思います。

スキルアップ/キャリアアップ(JOB@IT)