Java Fileをアップロードする(Servlet + JSP)
ファイルをアップロードする
ServletとJSPを用いてファイルをアップロードするプログラムを作成する
ポイント
JSP側
- formタグの
enctype
属性にmultipart/form-data
を指定することでJSPからファイルのデータを送信できるようになる。 method
属性には必ず、POST
を指定すること- inputタグの
type
にfile
を指定することでファイルダイアログでファイルの選択可能
HttpServletRequest#getPart
で送信されたファイルのデータ(もしくは、そのフォームのデータ)を取得する- クラスに
@MultipartConfig
というアノテーションをつける Part#write
で保存(絶対パスを指定する?)
以下はアップロードされたファイル名で保存するための処理
Part#getHeader
の引数にContent-Disposition
でヘッダーの情報を取得";"
で分割する- filenameの値がファイル名であるため、
"
の位置を取得して、切り出す "
を無くすことでファイル名が取得できる
サンプルコード
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>Insert title here</title> </head> <body> <h1>アップロード</h1> <form method="POST" enctype="multipart/form-data" action="/FileDLUL/UploadServlet"> <input type="file" name="file" /><br /><br /> <input type="submit" value="アップロード" /> </form> </body> </html>
UpLoadServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part part = request.getPart("file"); String fileName = extractFileName(part); part.write("C:\\temp\\" + fileName); } /** * ファイル名を取り出す * @param part パート * @return ファイル名 */ private String extractFileName(Part part) { // System.out.println(part.getHeader("Content-Disposition")); // これが出力される-> form-data; name="file"; filename="pic_278.png" String[] splitedHeader = part.getHeader("Content-Disposition").split(";"); String fileName = null; for(String item: splitedHeader) { if(item.trim().startsWith("filename")) { fileName = item.substring(item.indexOf('"')).replaceAll("\"", ""); } } return fileName; }