- PR -

ファイルダウンロードについて

投稿者投稿内容
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-10-05 11:19
いつもお世話になってます。迷い猫です。

今回はファイルのダウンロードについて質問させてください。
すごく初歩的なことだったら申し訳ないです><;

圧縮されているファイルを解凍し、
解凍したファイルをローカルディレクトリに
ダウンロード(保存)したいのですが、
今の私のやり方では、対象のファイル名で空のファイルが
保存されます。
いくつかの方法を試してみましたが、
きちんとダイアログが表示される方法が
下記のやり方だったんですが、
このやり方では、新規でファイルを作るという
形になってしまうのでしょうか?
説明不足で申し訳ないのですが、ご教授のほど宜しくお願い致します。

ソース =============================== Start

response.setContentType( "application/octet-stream" );
response.setHeader("Content-Disposition","attachment;filename=\""+ fileName + "" );
response.setBufferSize( 163840 );
PrintWriter out = response.getWriter();
out.println();
out.close();

ソース =============================== End


環境:
WindowsXP
Tomcat5.0
Eclipce2.1
Struts1.1
j2sdk1.4.1_02


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-05 11:28
>解凍したファイルをローカルディレクトリに
>ダウンロード(保存)したいのですが
それはクライアントの役割ではないでしょうか?
一レスポンスで複数のファイルを送るようなことはできないような・・。

>説明不足で申し訳ないのですが、ご教授のほど宜しくお願い致します。
説明不足であればもう少し補足してはいかがでしょう?ちょっとなにをやりたいのかわかりにくいです。

なお、J2SDK1.4.1_02 は EOL(End Of Life)を迎えた製品です。
http://java.sun.com/products/archive/j2se-eol.html
もうサポートされておりませんので、現行製品の最新版、1.4.2_05 や 5.0FCS 等を利用することをお勧め致します。
http://java.sun.com/j2se/1.4.2/index.jsp
http://java.sun.com/j2se/1.5/index.jsp
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-10-05 11:55
早速の回答ありがとうございます。

>一レスポンスで複数のファイルを送るようなことはできないような・・。

サーバー側で解凍したファイルは必ず1つで、
そのファイルをローカルにダウンロードしたいのですが・・・
サーバー側からファイルをローカルに送信(?)するやり方が、
まだ完全には理解できていないため、
もう一度、一から調べなおしてみます。

インギさんありがとうございました。

okutin
ベテラン
会議室デビュー日: 2003/12/11
投稿数: 98
お住まい・勤務地: 広島
投稿日時: 2004-10-05 12:11
こんにちは。

サーバからブラウザに転送したいファイル、つまりサーバから見てローカルにあるファイルを読み出し、それをレスポンスに書き出すという処理を行う必要がありますが、その処理は入ってますか?
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-10-05 13:18
念のためですが・・・
引用:
out.println();


だけだと改行文字が出力されるだけです。
引用:
Disposition","attachment;filename=\""+ fileName + "" );


で設定されるのはファイル名だけで、ファイルそのものは関係しません。
PrintWriterにファイルの内容を書き込む処理が必要ですが、ダウンロードする
ファイルはバイナリだと思いますので、文字しか扱えないPrintWriterではなく、
OutputStreamWriterなどを使うと良いと思います。
コード:
Writer out 
 = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()
));

佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-10-05 13:59
引用:

ファイルはバイナリだと思いますので、文字しか扱えないPrintWriterではなく、
OutputStreamWriterなどを使うと良いと思います。
コード:
Writer out 
 = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()
));




ガビーン!

ファイルはバイト列なんだからWriter使っちゃダメです…
まぁテキストファイルしか扱わないなら一見問題なく動くと思いますけど。
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-10-05 14:10
okutinさん、taroさん、佐々木さんご回答ありがとうございます。

>PrintWriterにファイルの内容を書き込む処理が必要ですが・・・

内容を書き込む処理入れてませんでした。

また、検索をして、参考になりそうなものを見つけたのですが、
URLの指定をするやつで、それが一般的なやり方なんでしょうが、
まだ、webサーバーがないため、
テスト的にDドライブからCドライブにダウンロード
という風に作成しています。
ローカルの場合、URLって指定できますか?

>ファイルはバイト列なんだからWriter使っちゃダメです…

ファイルは、エクセルだったりテキストだったり特に決まりはありません。
Writer より PrintWriter のほうがいいのでしょうか?

初歩的なことばかりで申し訳ありませんが宜しくお願い致します。
迷い猫
常連さん
会議室デビュー日: 2004/08/13
投稿数: 30
投稿日時: 2004-10-05 14:25
みなさんご回答ありがとうございました。

一応ダウンロードができるようになりました。
最初に質問で出したものとはやり方が変わってしまいましたが、
下記のようにしてみました。
こっちのやり方のほうがいいよ!!というような部分がありましたら、
またアドバイスを宜しくお願い致します。

また、今はローカルで処理を行っていますが、
サーバーよりダウンロードする場合、
下記のやり方でも大丈夫なんでしょうか?


response.setContentType( "application/octet-stream-dummy" );
response.setHeader("Content-Disposition","inline; filename=\"" + fileName + "");

try {
DataOutputStream dos = new DataOutputStream( response.getOutputStream( ) );
FileInputStream fis = new FileInputStream(file );

byte[ ] buffer = new byte[ 1024 ];
int readbyte = 0;

while( true ) {
readbyte = fis.read( buffer );
if( readbyte == -1 ) {
break;
}
dos.write( buffer, 0, readbyte );
dos.flush( );
}

fis.close( );
dos.close( );
}
catch( Exception ex ) {
ex.printStackTrace( );
}

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