Servlet 3.0 File Upload 機能

2010年3月11日 at 10:33 午後 3件のコメント

Servlet 3.0 ではマルチパートデータを扱う事ができるようになったため、とても簡単にファイルアップロード機能を実現できます。

(表示用 HTML)

<html>
    <head>
        <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
        <title>JSP Page</title>
    </head>
    <body>

        <FORM action=”/FileUpload/MyFileUpload” enctype=”multipart/form-data” method=”POST”>
            アップロードするファイル名: <INPUT type=”file” name=”content”>
            <INPUT type=”submit” value=”Submit”>
        </FORM>

    </body>
</html>

アップロードしたファイル名を取得するためには、getFilename() メソッドで実装しているように、ヘッダ:Content-Disposition の内容を取得しファイル名を抽出します。Content-Disposition ヘッダは下記のような値を含みますので、filename の部分を取得します。

Content-Disposition: form-data; name=”content”; filename=”FILE_NAME”

また、@MultipartConfig のアノテーションを使用して、アップロードするファイルの上限や、配置場所等を設定します。

import java.io.IOException;
import java.io.PrintWriter;
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(name=”MyFileUpload”, urlPatterns={“/MyFileUpload”})
@MultipartConfig(fileSizeThreshold=5000000,maxFileSize=10000000,location=”/tmp”)
public class MyFileUpload extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        // <INPUT type=”file” name=”content”> で指定した名前より取得
        Part part = request.getPart(“content”);
        // ファイル名の取得
        String name = getFilename(part);
        // ファイルの保存 @MultipartConfig(location=”/tmp”) で設定した
        // ディレクトリ配下に保存される。
        part.write(name);

        PrintWriter out = response.getWriter();
        out.println(“<HTML><BODY>”);
        out.println(“File : ” + name + ” is update successful”);
        out.println(“</BODY></HTML>”);
        out.flush();
        out.close();
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
        processRequest(request,response);
    }

    private String getFilename(Part part) {
        for (String cd : part.getHeader(“Content-Disposition”).split(“;”)) {
            if (cd.trim().startsWith(“filename”)) {
                return cd.substring(cd.indexOf(‘=’) + 1).trim().replace(“\””, “”);
            }
        }
        return null;
    }
}

簡単なメモ書き程度ですが、簡単にファイルアップロード機能を実装できる事が
お分かり頂けるかと思います。

本当は、Async Servlet を使って時間のかかるアップロード処理を非同期で
実現するコードも紹介したいのですが、一部動作がおかしく調査中ですので、
後日うまくいけば、ここに追記します。

Entry filed under: 未分類.

ここから始める Java EE 6 Servlet 3.0 の新機能概要

3件のコメント

  • 1. 曽根昭夫  |  2010年7月29日 2:44 午前

    Asynchronous Servletの具体例をネット上で探しているのですが,現実的なものが少なく,簡単な例でも,glassfish v3/v3.01では
    java.lang.IllegalStateException: Request is within the scope of a filter or servlet that does not support asynchronous operations
    が返されてしまいます.3月に調査中とのでしたが,その後どうなったのでしょうか?

    • 2. Yoshio Terada  |  2010年9月10日 10:51 午前

      GlassFish の updatecenter から Java EE 6 のサンプルを入手して頂いた後、
      NetBeans でプロジェクトを開き、デプロイして頂くと、サンプルの
      チャットアプリケーションが動作します。

      javaee6/web/servlet/async-request-war

      ただし、日本語処理において問題がありますので、
      ContentType のコードを下記のように変更して頂ければ
      日本語も通るかと思います。
      response.setContentType(“text/html; charset=UTF-8”);

      どうぞ、サンプルよりお試しください。


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2010年3月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

clustermap

ブログ統計情報

  • 1,288,647 hits

Feeds

アーカイブ