トッカンソフトウェア

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 にアクセスすると実行できます。



ダウンロード後に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();
	}
}


			




ページのトップへ戻る