トッカンソフトウェア

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();
	}
}


			




ページのトップへ戻る