Java Servletによるファイルダウンロード処理

ファイル形式とダウンロードリンク実装

テキスト/画像/圧縮/動画形式(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");
}

タグ: Java Servlet JSP ファイルダウンロード 文字エンコーディング

7月14日 21:43 投稿