- PR -

Servletにてファイルダウンロード時にファイルまたはコピーエラー発生

1
投稿者投稿内容
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2005-02-25 15:29
Tomcat4.1.27を利用しています。

Web上にあるファイルをダウンロードするために以下のコードを実行している
のですが、ある名前のファイルのダウンロード時に名前を付けて保存を実行すると、
ダウンロード後に
「ファイルまたはコピーエラー 指定されたファイル名は無効かまたは長すぎます」
というエラーが表示されます。

調査してみると
−ダウンロード時に名前を変えても同様。
−Windows2000 SP4で発生。WindowsXPでは発生しない。
ので、OSもしくはブラウザに依存している気もするのですが、何かお気付きの
点等アドバイスがありましたらよろしくお願いします。

−−−
OutputStream out = response.getOutputStream();
//ファイル名取得
String fname = (String) request.getAttribute("file_name");

//ディレクトリ名取得
ResourceBundle objRB = null;
objRB = ResourceBundle.getBundle("setting");
doc = objRB.getString("doc");

File file = new File(doc + "\\" + fname);
long size = file.length();

FileInputStream in = new FileInputStream(doc + "\\" + fname);
response.setContentLength((int) size);
response.setContentType("application/octet-stream");

String useragent = request.getHeader("user-agent");
String fileName = fname;

if (useragent.indexOf("MSIE") != -1) {
 fileName = URLEncoder.encode(filename, "UTF-8");
}

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

int c;
while ((c = in.read()) != -1) {
 out.write(c);
}

out.close();
in.close();
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-25 15:45
IE はダウンロード時に一旦テンポラリディレクトリにファイルを書き出すみたいですが、そのファイル名がだめなのかもしれませんね。
#あれ、でもそうしたらそもそもダウンロードができないか?
ファイル名の長さ、含んでいる文字などに特徴があるのだと思いますがどういった名前の時に失敗しますか?
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2005-02-25 21:30
インギさんアドバイスありがとうございます。

>ファイル名の長さ、含んでいる文字などに特徴があるのだと思いますがどういった名前の時に失敗しますか?

具体的なファイル名は会社名が入っているので出せなかったのですが、特に
特別な文字は入っていないと思います。記号は()だけですが、他のファイル
名でも利用しています。

OS(もしくはブラウザ)が異なると動作が変わりますが、そのファイルだけ
というのがちょっと引っかかっています。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-26 04:47
「ある名前のファイルのダウンロード時に」ということでファイル名によって挙動が変わるものと切り分けられていたのかと思いましたがそうではないのですね。
再現条件が他にないか洗い出してみてはいかがでしょうか。
例えば
・そのファイルをApacheに配置しても発生するか
・ファイル名を変更しても発生するか
・Tomcat 以外のアプリケーションサーバで発生するか
・パケットをキャプチャして他のファイルのダウンロード時と違いがないか比較
などです
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-02-26 13:55
ファイル名に日本語を使わないのが安全です。昔からトラブルの素。
まずはファイル名の書式が正しいかを確認してみてはいかがですか?

あまり詳しくないので、ヒントだけ。

Content-Disposition に関しては、

http://www.emaillab.org/essay/japanese-filename.html

に書かれています。


[ メッセージ編集済み 編集者: おっきー 編集日時 2005-02-26 14:09 ]
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2005-02-26 14:59
インギさん、おっきーさんアドバイスありがとうございます。

おっきーさんのコメントから直接的なファイル名変更について確認していない
ことに気づきました。
(他の数百のファイル名で問題無かったため意識から抜けていました)

テスト結果は以下の通り

ファイル名:○○○○○○○○○○(●●●●●●).pdf
(具体的なファイル名を出せずに申し訳ありません)

・文字に関係なく文字の削除 OK
・文字の追加 OK
・文字の置換 OK
・他の種類のファイルを同一のファイル名に変更(ACCESS) NG

再現パターンは全く想像がつきませんが、全く同一のファイル名でないと
現象が発生しないことが分かりました。

・WindowsXPのブラウザでは発生しないこと
・ローカルフォルダへのファイルコピーでは問題ないこと

以上を合わせると、Windows2000 Professional SP4のブラウザのバグの
可能性が高い気がします。

>ファイル名に日本語を使わないのが安全です。昔からトラブルの素。

開発者としては制限を設けるのは楽ですが、利用者の視点からは
・日本語に対応しているシステムがあること
・利便性
から受け入れがたく、なかなか悩ましい所です。
(当初ファイル名が文字化けしていた時はローマ字限定でした。)

アドバイスありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-26 15:08
なるほど。面白い現象ですね。
Tomcatに依存した現象なのでしょうか?
ブラウザの問題であればブラウザのベンダのサイトを確認したり、サポート窓口に問い合わせてみたりしてはいかがでしょうか。
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2005-03-07 13:51
インギさん、アドバイスありがとうございます。

その後、ファイル名による再現性の規則性については分かっていませんが、
一時ファイルのフォルダをデフォルトからより階層の浅いフォルダに設定
することで現象を回避出来ました。

ありがとうございました。
1

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