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