Servletでダウンロード
今回はダウンロードをやります。
プロジェクト作成は こちらを参考にして下さい。。
CSVファイルのダウンロード
HttpServletResponse に対し、CSVファイル情報を出力します。
package servlet.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Download")
public class Download extends HttpServlet {
private static final long serialVersionUID = 1L;
public Download() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/csv;charset=UTF8");
String fileName = new String("サンプル.csv".getBytes("Shift_JIS"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
PrintWriter writer = response.getWriter();
writer.write("abc,def,123\r\n");
writer.write("あいう,感じ,0.123\r\n");
writer.close();
}
}
ファイル名は上記のようにやると日本語文字化けしません。
Jsp
download.jsp という名前でJspファイルを作成します。今回はSubmitで作成しています。
<%@ page language="java" contentType="text/html; charset=UTF8"
pageEncoding="UTF8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ダウンロード</title>
</head>
<body>
<form name="dl" action="/test/Download" method="POST">
<a href="#" onClick="dl.submit();">ダウンロード</a>
</form>
</body>
</html>
実行
http://localhost:8080/test/download.jsp にアクセスすると実行できます。ファイルを読み込んでダウンロード
指定フォルダのファイル一覧をリンクとして表示し、クリックするとダウンロードするサンプルです。汎用的なダウンロードではContentTypeにapplication/octet-streamを指定します。
Download.java
package servlet.test;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Download")
public class Download extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String dirPath = "C:\\work";
public Download() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<String> ary = new ArrayList<>();
// ファイル一覧取得
File[] files = new File(dirPath).listFiles();
// リストに格納
for (File file : files) {
if (file.isFile()) {
ary.add(file.getName());
}
}
// リストから配列に変換
String[] strs = ary.toArray(new String[ary.size()]);
// 呼び出し先Jspに渡すデータセット
request.setAttribute("fromServlet", strs);
// download.jsp にページ遷移
RequestDispatcher dispatch = request.getRequestDispatcher("download.jsp");
dispatch.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF8");
response.setContentType("application/octet-stream");
// ファイル名を取得
String postName = request.getParameter("postName");
// ダウンロードファイル名を設定
String fileName = new String(postName.getBytes("Shift_JIS"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 出力ストリームを取得
OutputStream out = response.getOutputStream();
// ダウンロードするファイルのパス取得
Path path = Paths.get(dirPath, postName);
// ファイルを読み込み、ストリームに書き込み
out.write(Files.readAllBytes(path));
}
}
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF8"
pageEncoding="UTF8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ダウンロード</title>
<script type="text/javascript">
function exec(val) {
document.getElementById("postName").value = val;
document.form.submit();
}
</script>
</head>
<body>
<form action="/test/Download" method="post" name="form">
<%
String[] strs = (String[]) request.getAttribute("fromServlet");
for (String str : strs) {
out.println("<a href=\"javascript:exec('" + str + "');\">" + str + "</a><br>");
}
%>
<input type="hidden" id="postName" name="postName" />
</form>
</body>
</html>
実行
ダウンロード後にJavaScriptの関数を実行
ダウンロードの場合、ページが描画されないためJavaScriptを実行できなそうですが、Cookieを使うことによりJavaScriptを実行できます。ダウンロード処理を実行する前に、setIntervalでCookieを指定時間ごとに監視するようにして、Servlet側でCookieを変更する処理を行います。
Jsp
<%@ page language="java" contentType="text/html; charset=UTF8"
pageEncoding="UTF8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ダウンロード</title>
</head>
<body>
<form name="dl" action="/test/Download" method="POST">
<a href="#" onClick="exec();">ダウンロード</a>
</form>
</body>
<script type="text/javascript">
var interval;
function downaloded(callbackFunc) {
// クッキーを監視
interval = window.setInterval(function() {
var position = document.cookie.indexOf("XXX");
// クッキーが変更された
if (position != -1) {
// 監視を停止
window.clearInterval(interval);
// クッキーを削除
var date = new Date();
date.setTime(date.getTime() - 1);
document.cookie = 'XXX=; expires=' + date.toUTCString();
// コールバック関数を実行
callbackFunc();
}
}, 1000);
}
function exec() {
downaloded(function() {
alert("download");
});
dl.submit();
}
</script>
</html>
Servlet
package servlet.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Download")
public class Download extends HttpServlet {
private static final long serialVersionUID = 1L;
public Download() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// クッキーを設定
Cookie cookie = new Cookie("XXX", "1");
response.addCookie(cookie);
response.setContentType("text/csv;charset=UTF8");
String fileName = new String("サンプル.csv".getBytes("Shift_JIS"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
PrintWriter writer = response.getWriter();
writer.write("abc,def,123\r\n");
writer.write("あいう,感じ,0.123\r\n");
writer.close();
}
}
ページのトップへ戻る