- PR -

ファイルダウンロード時にファイル名が文字化けする。

1
投稿者投稿内容
キヨ
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 65
投稿日時: 2006-11-29 18:30
お世話になります。
質問です。

すみませんが、よろしくお願いします。

【現象】
WEB画面から添付ファイルをダウンロードする際に
添付ファイル名(全角文字)が文字化する。

ファイル名が化けているだけで、ファイル名を正しいファイル名に変名すると内
容は正しく開けます。

【環境】
1.クライアントOS:Windows2000Pro SP4 JAVA:1.4.2_05-b04
2.サーバーOS:FedoraCore2 JAVA:1.4.2_05b04
3.DBサーバーOS:アプリサーバーと同居につき同じ
4.eclipseにてコンパイルしています。

【ソース】
下記にそのプログラムを載せます。@の箇所が対象箇所です。

// 指定されたファイルの送信
// 添付ファイル情報の取得
AppendDao dao = new AppendDao();

Append app = dao.get( req.getParameter( "surveyId" ), req.getParameter( "fileNo" ), req.getParameter( "reqOrgId" ) );

if( app == null ) {
String msg = "指定された添付ファイル情報が存在しない。" +
req.getParameter( "surveyId" ) + ":" + req.getParameter( "fileNo" ) + ":" + req.getParameter( "ansOrgId" );
log.error( msg );
throw new RuntimeException( msg );
}

//データベースよりファイル名を取得
FileInputStream is = new FileInputStream( app.getFilePath() );
//取得したファイル名を変数にセット
String defaultFileName = app.getFileName();

//この時点では正しくファイル名がdefaultFileNameにセットされている。
//例:ABCDE.txt・・・等

//2005/11/25 charsetをWindows-31Jへ変更
res.setContentType("application/octet-stream; charset=\\"Windows-31J\\"");
res.setCharacterEncoding( "Windows-31J" );
res.setCharacterEncoding( "UTF-8" );

//String useragent = req.getHeader("user-agent");

@//取得したファイル名がUNICODE形式なのでバイト単位で取り出して、取り出したバイト列をWindows31Jに変換しfilenameにセット
String fileName = new String(defaultFileName.getBytes("ISO-8859-1"), "Windows-31J");

//この時点でdefaultFileNameが全角文字だった場合、化ける
//例:ABCDE.txt に対して ?????.txt・・・等

//ファイル名の長さ取得
int wLong = fileName.length();

res.setIntHeader( fileName, wLong );
res.setHeader("Content-Disposition", "attachment; filename=\\"" + fileName + "\\"");

OutputStream os = res.getOutputStream();
BufferedOutputStream bo = new BufferedOutputStream( os );
OutputStreamWriter w = new OutputStreamWriter(os, "Windows-31J");
BufferedWriter writer = new BufferedWriter(w);
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-11-29 18:37
過去のスレッドを検索してみてはいかがでしょう。
http://www.atmarkit.co.jp/bbs/phpBB/search.php?term=content-disposition%20%CA%B8%BB%FA%B2%BD%A4%B1&addterms=any&addterms=all&forum=12&sortby=-1&sortby=2&sortby=3&sortby=4&searchboth=both&searchboth=title&searchboth=text&submit=%B8%A1%BA%F7&

ここらへん参考になりそうです↓
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13555&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13350&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4744&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3659&forum=12

[ メッセージ編集済み 編集者: インギ 編集日時 2006-11-29 18:37 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-29 19:54
引用:

キヨさんの書き込み (2006-11-29 18:30) より:
@//取得したファイル名がUNICODE形式なのでバイト単位で取り出して、取り出したバイト列をWindows31Jに変換しfilenameにセット
String fileName = new String(defaultFileName.getBytes("ISO-8859-1"), "Windows-31J");



いったい何時の時代の遺跡を掘り出したんだろう…。
大昔のHttpRequestからgetAttribute()する際の文字化けに対する対処ですよね。コレ。

意味分かって使っていますか?
とりあえずコレをはさめば大丈夫と考えなしに適用したんだとしたら
getBytees()とStringのコンストラクタのドキュメント読んで理解してから
出直して来いといったところですが。

defaultFileNameってStringの変数はapp.getFileName()でとっているから、
要するにAppendクラスから取得しているんでしょう?
この時点で化けているんですか?
正常なStringを意味もなく別文字コードでエンコードしなおせば当然化けますよ。

setHeader()する際に文字化けするという話だとしたら、
HTTPのプロトコルの仕様上ヘッダには日本語が使えないので
MIME形式に変換してやる必要があります。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/net/URLEncoder.html
googleとかのGETパラメータとかでよく見る%20とかの形式ですね。
1

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