「Java/Tomcat/サーブレットからCSVファイルをダウンロードするサンプル(日本語ファイル名)」の編集履歴(バックアップ)一覧に戻る
import java.io.*;
import java.net.URLEncoder;
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
public class DynamicCsvJpServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// POSTメソッドでアクセスが来てもGETメソッドで全部処理します。
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// CSV出力用データ
String[][] rows = {
{ "0", "ダイナミック", "dynamic@example.com" },
{ "1", "ホゲ", "hoge@example.com" },
{ "2", "モゲ", "moge@example.com" },
{ "3", "マゲ", "mage@example.com" },
{ "4", "フゥ", "foo@example.com" },
{ "5", "バァ", "bar@example.com" },
{ "6", "グゥ", "goo@example.com" }
};
// ファイル名設定
// リクエストパスからファイル名を取得
String fileName = new String(req.getPathInfo().substring(1).getBytes("ISO-8859-1"), "UTF-8");
// リクエストヘッダからユーザーエージェント(ブラウザの名前)取得
String ua = req.getHeader("user-agent");
if (ua.contains("MSIE")) {
// IE用ファイル名エンコード
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
// IE以外(FireFox,Safari,Chrome)ファイル名エンコード
fileName = MimeUtility.encodeWord(fileName, "ISO-2022-JP", "B");
}
// レスポンスヘッダー設定
if (ua.contains("Safari")) {
// サファリ用
resp.setContentType("application/octet-stream;");
} else {
// サファリ以外用
resp.setContentType("text/csv; charset=UTF-8;");
resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}
// CSVデータ作成
StringBuffer sb = new StringBuffer();
for (String[] row : rows) {
for (int i = 0; i < row.length; i++) {
if (i == 0) {
sb.append("\"");
} else {
sb.append("\",\"");
}
sb.append(row[i]);
if (i == row.length - 1) {
sb.append("\"\n");
}
}
}
// レスポンスにCSV出力
PrintWriter w = resp.getWriter();
w.print(sb.toString());
w.flush();
}
}
// リクエストパスからファイル名を取得
String fileName = new String(req.getPathInfo().substring(1).getBytes("ISO-8859-1"), "UTF-8");
// リクエストヘッダからユーザーエージェント(ブラウザの名前)取得
String ua = req.getHeader("user-agent");
if (ua.contains("MSIE")) {
// IE用ファイル名エンコード
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
// IE以外(FireFox,Safari,Chrome)ファイル名エンコード
fileName = MimeUtility.encodeWord(fileName, "ISO-2022-JP", "B");
}
// レスポンスヘッダー設定
if (ua.contains("Safari")) {
// サファリ用
resp.setContentType("application/octet-stream;");
} else {
// サファリ以外用
resp.setContentType("text/csv; charset=UTF-8;");
resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- サーブレットの宣言 -->
<servlet>
<servlet-name>dynamiccsvjpservlet</servlet-name>
<servlet-class>DynamicCsvJpServlet</servlet-class>
</servlet>
<!-- サーブレットとurlのマッピング -->
<servlet-mapping>
<servlet-name>dynamiccsvjpservlet</servlet-name>
<url-pattern>/dynamiccsvjpservlet/*</url-pattern>
</servlet-mapping>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF8" pageEncoding="UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<a href='<%=request.getContextPath()+"/dynamiccsvjpservlet/" +
java.net.URLEncoder.encode("日本語.csv","UTF-8")%>'>エンコードあり</a><br>
<a href='<%=request.getContextPath()+"/dynamiccsvjpservlet/日本語.csv"%>'>エンコードなし</a><br>
</body>
</html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<a href='/Tomcat7Test/dynamiccsvjpservlet/%E6%97%A5%E6%9C%AC%E8%AA%9E.csv'>エンコードあり</a><br>
<a href='/Tomcat7Test/dynamiccsvjpservlet/日本語.csv'>エンコードなし</a><br>
</body>
</html>