Servlet 3.0 File Upload 機能

2010年3月11日 at 10:33 PM 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 AM

    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 AM

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

      javaee6/web/servlet/async-request-war

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

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


Java Champion & Evangelist

ご注意

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

カレンダー

2010年3月
« 2月   4月 »
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

Twitter

  • @masanobuimai (^_^) たぶんあそこは違う!!(^_^) 8 hours ago
  • @masanobuimai ごめんなさい。 8 hours ago
  • 今日、久々にキレてしまった。(T_T) 大人気ない自分に半生。 理由は分かってる。対応してくれたあの方が悪かったわけではなく、あのバックエンドシステムが全く顧客志向になってないだけなんだけど。 でも未だにこんな融通のきかないシステム運用してて大丈夫? 9 hours ago
  • RT @superriver: ちょまどさんのキャリアはとても面白い。趣味でやってたプログラミングと絵描き、大学の英文、バイトの塾講師などが全部つながって大きな影響力を出せる状態になっている。本人も含めそんなこと考えていなかったに違いない。発掘した砂金プロデューサーの手腕もすご… 15 hours ago
  • ちょっと古いけど。 1 day ago

clustermap

ブログ統計情報

  • 923,761 hits

Feeds


%d人のブロガーが「いいね」をつけました。