Tomcat7 で簡単ファイルアップロード

Eclipseで、動的Webプロジェクトとして、sample.fileupload.tomcat7というプロジェクトを作成したとします。


Tomcat7では、アノテーションが使えるので、次のようなサーブレットを作ってRun on Serverで実行すると、すぐに使えます。http://localhost:8080/sample.fileupload.tomcat7/hello へアクセスすると、HELLO! という文字列がブラウザで表示されます。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="SimpleServlet",urlPatterns={"/hello"})
public class SimpleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().print("HELLO!");
    }
}

次にファイルアップロードのために、WebContentディレクトリへ、form.jspを用意します。次のようになります。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>fileupload sample</title>
</head>
<body>
<form action="upload.html" method="post" enctype="multipart/form-data">
  file name:
  <input type="file" name="filename" size="20" /><br />
  <input type="submit" value="upload" />
</form>
</body>
</html> 

FileuploadServletは次のようになります。C:/Tempはあらかじめ作っておきます。Windowsでない場合は、/tmp とします。ファイル名の取得方法がちょっと面倒でしたが、もっと簡単にする方法があるかもしれません。これでhttp://localhost:8080/sample.fileupload.tomcat7/upload.html から、C:/Tempへファイルを保存できます。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.StringTokenizer;

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("/upload.html")
//@MultipartConfig(location = "/tmp", fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5)
@MultipartConfig(location = "C:/Temp", fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5)
public class FileUploadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    getServletContext().getRequestDispatcher("/form.jsp")
        .forward(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    resp.setContentType("text/html");
    PrintWriter out = resp.getWriter();

    Collection<Part> parts = req.getParts();

    out.write("<h2> Total parts : " + parts.size() + "</h2>");

    for (Part part : parts) {
      part.write(getPartInfoHtml(part));
      part.write(getFileName(part));
    }

  }
  private String getFileName(Part part) {
    String result = "samplefile";
    headercheck:
    for (String header : part.getHeaderNames()) {
      //content-disposition : form-data; name="filename"; filename="mt.txt"
      if ("content-disposition".equals(header)) {
        StringTokenizer st = new StringTokenizer(part.getHeader(header), ";");
        while (st.hasMoreTokens()) {
          String s = st.nextToken().trim();
          if (s.startsWith("filename=\"")) {
            result = s.replace("filename=\"", "");
            result = result.substring(0, result.length()-1);
            break headercheck;
          }
        }
      }
    }
    return result;
  }
  private String getPartInfoHtml(Part part) {
    StringBuffer sb = new StringBuffer();
    sb.append("Name : " + part.getName() + "<br>");
    sb.append("Content Type : " + part.getContentType() + "<br>");
    sb.append("Size : " + part.getSize() + "<br>");
    for (String header : part.getHeaderNames()) {
      sb.append(header + " : " + part.getHeader(header));
      sb.append("<br>");
    }
    sb.append("</p>");
    return sb.toString();
  }
}

関連書籍:まだTomcat7の書籍は少ないのでTomcat6のものがほとんどです。


Javaを基礎から学びたい人は、「改訂版-基礎Java-CD-ROM付」をどうぞ。Amazonの評価では、サンプルが単調という意見と、サンプルが難しすぎるという意見があり、どちらを信じればいいのかわからない状態になっています。著者の意見としては、本書ではプログラマになるために必要な基礎知識をしっかりと説明しています。ちょっと難しい内容であっても、基礎として必要なものは盛り込んでいます。また、最初のプログラミングの基本を理解するための章では、若干退屈でも初心者が理解できることに重点をおいて、プログラミング経験者が読んだら単調と思われる内容もきちんと説明しています。後半のサンプルプログラムが難しそうに感じるかどうかは人によってですが、実用的な内容となるように選んだ題材を、きちんとオブジェクト指向で書いてあります。今後プロフェッショナルとして、Javaのプログラムを作成するにあたって必要な知識を身につけたい人にとっては、価値のある一冊となるはずです。

ちなみに、どういった意図で本書が執筆されているかは「改訂版 基礎 Java について – hiro345」に書いてあります。参考にしていただければと思います。

同じタグの記事: Java
同じカテゴリの記事: Program
関連書籍: Java