Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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 一時保存するファイルサイズの閾値(バイト)
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away