ファイル形式とダウンロードリンク実装
テキスト/画像/圧縮/動画形式(txt/png/zip/mp4)のダウンロードを実装するJSP例:
<%@ page contentType="text/html;charset=UTF-8" %> <html> <body> <a href="/app/FileDownload?file=document.txt">テキストファイル</a><br> <a href="/app/FileDownload?file=image.png">PNG画像</a><br> <a href="/app/FileDownload?file=archive.zip">ZIPアーカイブ</a><br> <a href="/app/FileDownload?file=video.mp4">MP4動画</a> </body> </html>
ダウンロードサーブレット実装
ファイルストリーム処理とブラウザ対応:
public class FileDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String fileName = req.getParameter("file");
fileName = new String(fileName.getBytes("ISO-8859-1"), StandardCharsets.UTF_8);
String encodedName = encodeFileName(req, fileName);
resp.setContentType(getServletContext().getMimeType(fileName));
resp.setHeader("Content-Disposition", "attachment; filename=" + encodedName);
Path filePath = Paths.get(getServletContext().getRealPath("downloads"), fileName);
try (InputStream in = Files.newInputStream(filePath);
OutputStream out = resp.getOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
}
private String encodeFileName(HttpServletRequest req, String name) throws IOException {
String userAgent = req.getHeader("User-Agent");
if (userAgent.contains("MSIE")) {
return URLEncoder.encode(name, "UTF-8").replace("+", " ");
} else if (userAgent.contains("Firefox")) {
return "=?UTF-8?B?" + Base64.getEncoder().encodeToString(name.getBytes()) + "?=";
} else {
return URLEncoder.encode(name, "UTF-8");
}
}
}
ブラウザ別エンコーディング処理
User-Agentヘッダに基づくファイル名エンコーディング:
String userAgent = request.getHeader("User-Agent");
String encodedName;
if (userAgent.contains("MSIE")) {
encodedName = URLEncoder.encode(originalName, "UTF-8").replace("+", " ");
} else if (userAgent.contains("Firefox")) {
encodedName = "=?UTF-8?B?" + Base64.getEncoder().encodeToString(originalName.getBytes()) + "?=";
} else {
encodedName = URLEncoder.encode(originalName, "UTF-8");
}