TIL

Today I Learned. 知ったこと、学んだことを書いていく

Java Fileをアップロードする(Servlet + JSP)

ファイルをアップロードする

ServletJSPを用いてファイルをアップロードするプログラムを作成する

ポイント

JSP

  • formタグのenctype属性にmultipart/form-dataを指定することでJSPからファイルのデータを送信できるようになる。
  • method属性には必ず、POSTを指定すること
  • inputタグのtypefileを指定することでファイルダイアログでファイルの選択可能

Servlet

  • 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;
}


その他のJavaの記事はこちら



参考文献