Archive for 2010年3月11日

Servlet 3.0 File Upload 機能

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

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


Java Champion & Evangelist

Translate

ご注意

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

カレンダー

2010年3月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

Twitter

  • RT @satyanadella: GitHub Copilot is the first at-scale developer tool, and today we're going further—bringing the power of Copilot past the… 8 hours ago
  • RT @seanjmullan: JDK 20 was released yesterday! Highlights of this release include further improvements that strengthen the default securit… 13 hours ago
  • RT @mkheck: Can’t get enough Spring content? Neither can I! That’s why I'm presenting "Build Better, Deploy Faster: Spring Boot + Spring C… 13 hours ago
  • RT @yuhattor: やばいのきました これからはエディターの外でも開発者の効率を爆上げします。まずはウェイトリスト登録! GitHub Copilot X👇 ●GPT4を採用 ●チャット/音声サポートでエディタでもChatGPTに似た体験 ●プルリクエストの文章自動生… 23 hours ago
  • RT @github: GitHub Copilot is already helping developers code faster in their IDEs. But what’s next? Our answer is GitHub Copilot X. It’s… 23 hours ago

clustermap

ブログ統計情報

  • 1,263,275 hits

RSSフィード

アーカイブ