1. 序章

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

これを実現するために、最初に、ネイティブ@MultipartConfigアノテーションによって提供されるファイルアップロード機能を備えたバニラJakartaEEソリューションを確認します。

次に、サーブレットAPIの以前のバージョンについて、Apache Commons FileUploadライブラリを確認します。

2. Jakarta EE @MultipartConfigを使用する

Jakarta EEには、箱から出してマルチパートアップロードをサポートする機能があります。

そのため、ファイルアップロードのサポートでJakarta 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()メソッドを使用して、リクエストからインバウンドファイルを簡単に取得し、ディスクに保存できます。

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. ApacheCommonsFileUploadの使用

サーブレット3.0プロジェクトを使用していない場合は、ApacheCommonsFileUploadライブラリを直接使用できます。

3.1. 設定

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

<dependency> 
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

最新バージョンは、Mavenの中央リポジトリでクイック検索を使用して見つけることができます:commons-fileuploadおよびcommons-io

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

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

  • .jspページのアップロードフォーム。
  • DiskFileItemFactoryおよびServletFileUploadオブジェクトを構成します。
  • マルチパートファイルアップロードの実際のコンテンツを処理します。

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

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

リクエスト処理メソッドでは、着信 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インスタンスにドロップして起動できます。

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

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

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

5. 結論

それでおしまい! JakartaEEとApacheのCommonFileUpload ライブラリを使用して、マルチパートファイルのアップロードを提供する方法を学びました。

コードスニペットは、いつものように、GitHubにあります。