search
LoginSignup
52

More than 5 years have passed since last update.

posted at

updated at

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 一時保存するファイルサイズの閾値(バイト)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
52