最終更新日:180827 原本2016/05/05 

JSP/サーブレット ファイルアップロードの実装

JSP/サーブレット(3.0以降)でのファイルアップロードの実装方法です。

JSP

JSP側ではformタグにて"enctype=multipart/form-data"と設定することで、フォームからファイルデータを送信できるようになります。

upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ファイルアップロード</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="../UploadServlet">
<input type="file" name="file"/><br />
<input type="submit" value="アップロード" />
</form>
</body>
</html>

サーブレット

サーブレット側の実装のポイントは以下のとおりです。

  • @MultipartConfigアノテーションで、サーブレットがmultipart/form-data形式のリクエストに対応
  • HttpServletRequest#getPartにて、リクエストからjavax.servlet.http.Partを取得
  • Part#writeにて、サーバの指定のファイルパスへファイルを保存
UploadServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/UploadServlet")
@MultipartConfig(location="/tmp", maxFileSize=1048576)
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("file");
        String name = this.getFileName(part);
        part.write(getServletContext().getRealPath("/WEB-INF/uploaded") + "/" + name);
        response.sendRedirect("jsp/upload.jsp");
    }

    private String getFileName(Part part) {
        String name = null;
        for (String dispotion : part.getHeader("Content-Disposition").split(";")) {
            if (dispotion.trim().startsWith("filename")) {
                name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim();
                name = name.substring(name.lastIndexOf("\\") + 1);
                break;
            }
        }
        return name;
    }
}

MultipartConfig

各設定値は以下のとおりです。

変数名 説明
location アップロードファイルを一時的に保存するフォルダパス
maxFileSize アップロードファイルの最大サイズ(バイト)
maxRequestSize リクエストデータの最大サイズ(バイト)
fileSizeThreshold 一時保存するファイルサイズの閾値(バイト)