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

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

1. 前書き

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

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

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

2. Java EEの使用@MultipartConfig

バージョン6以降、Java EEには、箱から出してマルチパートアップロードをサポートする機能があります。

そのため、ファイルアップロードのサポートでJava EEアプリを強化する場合、これはおそらくデフォルトの頼みの綱です。

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

Choose a file:

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

次に、we’ll want to annotate our HttpServlet with the correct information using the @MultipartConfig annotation

@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();

最後に、we can easily retrieve our inbound File from the request using the getParts() methodを作成し、ディスクに保存します。

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 CommonsFileUploadの使用

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

3.1. セットアップ

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


    commons-fileupload
    commons-fileupload
    1.3.3


    commons-io
    commons-io
    2.6

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

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

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

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

  • DiskFileItemFactoryおよびServletFileUploadオブジェクトを構成します。

  • マルチパートファイルアップロードの実際のコンテンツの処理。

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

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

リクエスト処理メソッドでは、着信HttpRequestをチェックでラップして、マルチパートアップロードかどうかを確認できます。

また、DiskFileItemFactory.で一時的に(処理中に)ファイルのアップロードに割り当てるリソースを指定します

最後に、we’ll create a ServletFileUpload object which will represent the actual file itselfです。 最終的な永続性サーバー側のマルチパートアップロードのコンテンツを公開します。

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 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インスタンスにドロップして起動できます。

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

image

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

image

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

image

5. 結論

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

コードスニペットは、いつものように、over on GitHubで見つけることができます。