サーブレットとJSPを使ったファイルのアップロード

1前書き

このクイックチュートリアルでは、サーブレットからファイルをアップロードする方法について説明します。

これを実現するために、ネイティブ @ MultipartConfig アノテーションによって提供されるファイルアップロード機能を備えた一般的なJava EEソリューションを最初に見ます。

それでは、以前のバージョンのサーブレットAPIについては、Apache Commonsのhttps://commons.apache.org/proper/commons-fileupload/using.html[ FileUpload ]ライブラリを調べます。

2 Java EEの使い方 @ MultipartConfig

  • バージョン6から、Java EEは箱から出してマルチパートアップロードをサポートすることができます。

そのため、ファイルアップロードをサポートするJava EEアプリケーションを充実させるときには、おそらくこれがデフォルトの問題になります。

まず、HTMLファイルにフォームを追加しましょう。

<form method="post" action="multiPartServlet" enctype="multipart/form-data">
    Choose a file: <input type="file" name="multiPartServlet"/>
    <input type="submit" value="Upload"/>
</form>

フォームは、マルチパートアップロードを通知するために enctype =” multipart/form-data” 属性を使用して定義する必要があります。

次に、** @ MultipartConfig アノテーションを使用して HttpServlet に正しい情報をアノテーションします。

@MultipartConfig(fileSizeThreshold = 1024 **  1024,
  maxFileSize = 1024 **  1024 **  5,
  maxRequestSize = 1024 **  1024 **  5 **  5)
public class MultipartServlet extends HttpServlet {
   //...
}

次に、デフォルトのサーバーアップロードフォルダが設定されていることを確認します。

String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD__DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();

最後に、** getParts() メソッドを使って request からインバウンドの File を簡単に取得し、それをディスクに保存することができます。

for (Part part : request.getParts()) {
    fileName = getFileName(part);
    part.write(uploadPath + File.separator + fileName);
}

この例では、ヘルパーメソッドgetFileName()を使用しています。

private String getFileName(Part part) {
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename"))
            return content.substring(content.indexOf("=") + 2, content.length() - 1);
        }
    return Constants.DEFAULT__FILENAME;
}
  • サーブレット3.1の場合。プロジェクトでは、代わりに Part.getSubmittedFileName() メソッドを使用することもできます。**

fileName = part.getSubmittedFileName();

3 Apache Commonsの使い方FileUpload

Servlet 3.0プロジェクトに参加していない場合は、Apache Commons FileUploadライブラリを直接使用できます。

3.1. セットアップ

この例を実行するには、次の pom.xml 依存関係を使用します。

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

最新のバージョンは、Mavenの中央リポジトリでクイック検索すると見つかります。

commons-fileupload およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22commons-io%22%20AND%20a%3A%22commons-io%22[commons-io]。

3.2. サーブレットをアップロード

Apacheの FileUpload ライブラリを組み込むための3つの主要部分は次のとおりです。

  • .jsp ページ内のアップロードフォーム。

  • DiskFileItemFactory オブジェクトと ServletFileUpload オブジェクトを設定します。

  • マルチパートファイルアップロードの実際の内容を処理する。

アップロードフォームは前のセクションのものと同じです。

Java EEサーブレットの作成に移りましょう。

リクエスト処理メソッドでは、受信した HttpRequest をマルチパートアップロードかどうかを確認するためのチェックでラップすることができます。

DiskFileItemFactory. には、(アップロード中に)一時的にアップロードするファイルに割り当てるリソースも指定します。

最後に、** 実際のファイル自体を表す ServletFileUpload オブジェクトを作成します。最後の永続化サーバー側のマルチパートアップロードの内容を公開します。

if (ServletFileUpload.isMultipartContent(request)) {

    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(MEMORY__THRESHOLD);
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setFileSizeMax(MAX__FILE__SIZE);
    upload.setSizeMax(MAX__REQUEST__SIZE);
    String uploadPath = getServletContext().getRealPath("")
      + File.separator + UPLOAD__DIRECTORY;
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
        uploadDir.mkdir();
    }
   //...
}

そして、それらの内容を抽出してディスクに書き込むことができます。

if (ServletFileUpload.isMultipartContent(request)) {
   //...
    List<FileItem> formItems = upload.parseRequest(request);
    if (formItems != null && formItems.size() > 0) {
        for (FileItem item : formItems) {
        if (!item.isFormField()) {
            String fileName = new File(item.getName()).getName();
            String filePath = uploadPath + File.separator + fileName;
                File storeFile = new File(filePath);
                item.write(storeFile);
                request.setAttribute("message", "File "
                  + fileName + " has uploaded successfully!");
        }
        }
    }
}

** 4例の実行

プロジェクトを .war にコンパイルしたら、それをローカルのTomcatインスタンスにドロップして起動できます。

そこから、フォームが表示されているメインのアップロードビューを表示できます。

リンク:/uploads/choosefile-100x9.png%20100w[]

ファイルが正常にアップロードされると、メッセージが表示されます。

リンク:/uploads/filesuccess-100x10.png%20100w[]

最後に、サーブレットで指定された場所を確認できます。

リンク:/uploads/imagesaved-100x31.png%20100w[]

5結論

それでおしまい! Java EEを使ったマルチパートファイルアップロードと、ApacheのCommon FileUpload ライブラリの提供方法を​​学びました。

コードスニペットは、いつものようにhttps://github.com/eugenp/tutorials/tree/master/javax-servlets[over on GitHub]にあります。