ブラウザでリンクをクリックした時、サーブレットでレスポンスにファイルを入れ、ダウンロードを実施できるように実装するためのメモを記載したいと思います。
目次
- 前提条件
- サンプルプログラム
- サンプルプログラムの結果
前提条件
- Windows XP Pro 32bit
- Servlet3.0
- JBoss As 7.1.1 Final
- java 1.7.XX
サンプルプログラム
サーブレットでのファイルダウンロードのサンプルソースを以下に記載します。
package test;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
@SuppressWarnings("serial")
@WebServlet(name = "download", urlPatterns = { "/download" })
public class Download extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletOutputStream op = null;
DataInputStream in = null;
String fileName = "テスト.txt";
String filePath = "D:/temp/" + fileName;
try {
java.io.File file = new File(filePath);
if (file.exists()) {
//レスポンスヘッダーの作成
response.setContentType("application/octet-stream");
response.setContentLength((int) file.length());
//ファイル名の設定ISO_8859_1にエンコード
response.setHeader("Content-Disposition", "inline; filename=\""
+ new String(fileName.getBytes("UTF-8"), "ISO_8859_1") + "\"");
//ファイルの読み込み
int bytes = 0;
op = response.getOutputStream();
byte[] bbuf = new byte[1024];
in = new DataInputStream(new FileInputStream(file));
while ((in != null) && ((bytes = in.read(bbuf)) != -1)) {
op.write(bbuf, 0, bytes);
}
op.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(op);
}
}
}
サンプルプログラムの結果
上記のサンプルを実行すると以下のようになります
0 件のコメント:
コメントを投稿