2008年04月10日

ファイルダウンロード処理(Java)

Javaでファイルダウンロードを行います。


import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.net.HttpURLConnection;
import java.net.SocketException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadFile extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse res)
throws ServletException, IOException {

File file = new File("c:\\sample.pdf");
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
//HTTPヘッダの出力
res.setContentType("application/octet-stream");
res.setHeader("Content-disposition", "attachment; filename=\"" + file.getName() + "\"");
res.setContentLength((int)file.length());
res.setHeader("Expires", "0");
res.setHeader("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
res.setHeader("Pragma", "private");

in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(res.getOutputStream());

byte buf[]=new byte[1024];
int len;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
} catch (SocketException e) {
//●ダウンロード処理中にダウンロードダイアログの「キャンセル」が
//クリックされた場合の例外。
//●ただし、ダウンロードダイアログが表示されているバックグラウンドで
//ブラウザへのダウンロードが行われていることに留意すること。
//●つまり小さいファイルでは、ダイアログが表示される時には、ダウンロード
//処理は完了し、サーブレットは終了してしまっており、SocketExceptionの
//も発生しないということです。
} catch (Exception e) {
//ファイルダウンロード用のHTTPヘッダをリセットします。
res.reset();
res.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR , e.toString());
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.flush();
out.close();
}
}
return;
}
}


posted by 台北猫々 at 08:00| Comment(0) | TrackBack(0) | 技術メモ(Java)