1概要



Apache Commons File Upload Library


は、

multipart/form-data

コンテンツタイプを使用してHTTPプロトコルを介して大きなファイルをアップロードするのに役立ちます。

この簡単なチュートリアルでは、それをSpringと統合する方法を見ていきます。


2 Mavenの依存関係

ライブラリを使用するには、

commons-fileupload

アーティファクトが必要です。

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

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22commons-fileupload%22[Maven Central]で見つけることができます。


3一括転送

デモ目的で、ファイルペイロードを含む

Controller

処理要求を作成します。

@PostMapping("/upload")
public String handleUpload(HttpServletRequest request) throws Exception {
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

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

    ServletFileUpload upload = new ServletFileUpload(factory);

    List items = upload.parseRequest(request);

    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = iter.next();

        if (!item.isFormField()) {
            try (
              InputStream uploadedStream = item.getInputStream();
              OutputStream out = new FileOutputStream("file.mov");) {

                IOUtils.copy(uploadedStream, out);
            }
        }
    }
    return "success!";
}

最初は、ライブラリの

ServletFileUpload

クラスにある

isMultipartContent

メソッドを使用して、** リクエストにマルチパートコンテンツが含まれているかどうかをチェックする必要があります。

デフォルトでは、

Springは

このライブラリを使用するには無効にする必要がある




MultipartResolver


を特徴としています。

これを実現するには、

application.properties

ファイルにこの設定を含めます。

spring.http.multipart.enabled=false

これで、ファイルを保存するディレクトリ、ライブラリがディスクに書き込むことを決定するしきい値、および要求の終了後にファイルを削除する必要があるかどうかを設定できます。

ライブラリは

DiskFileItemFactory

クラスを提供します。これは____

がファイルの保存とクリーニングのための設定を担当する


setRepository

メソッドはターゲットディレクトリを設定します。デフォルトは例に示されています。

次に、

setSizeThreshold

が最大ファイルサイズを設定します。

次に、

setFileCleaningTracker

メソッドを使用します。このメソッドは、nullに設定されていると、一時ファイルをそのまま残します。

デフォルトでは、リクエストが終了した後にそれらを削除します

これで、実際のファイル処理を続けることができます。

まず、以前に作成したファクトリを含めて

ServletFileUpload

を作成します。それからリクエストを解析してフォームフィールドのライブラリの主要な抽象化である

FileItem

のリストを生成します。

通常のフォームフィールドではないことがわかった場合は、

InputStream

を抽出し、

IOUtils

から便利なcopyメソッドを呼び出します。 a-file[この]チュートリアル)

.

これでファイルは必要なフォルダに保存されました。これはファイルへのアクセスを容易にするので、通常この状況に対処するより便利な方法ですが、時間/メモリ効率も最適ではありません。

次のセクションでは、ストリーミングAPIを見ていきます。


4ストリーミングAPI

ストリーミングAPIは使いやすく、一時的な場所にコピーしないことで大きなファイルを処理するのに最適な方法です。

ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterStream = upload.getItemIterator(request);
while (iterStream.hasNext()) {
    FileItemStream item = iterStream.next();
    String name = item.getFieldName();
    InputStream stream = item.openStream();
    if (!item.isFormField()) {
       //Process the InputStream
    } else {
        String formFieldValue = Streams.asString(stream);
    }
}

前のコードスニペットで、

DiskFileItemFactory

が含まれなくなったことがわかります。これは、** ストリーミングAPIを使用するときには、必要ないからです。

次に、フィールドを処理するために、ライブラリは

FileItemIterator

を提供します。これは、

next

メソッドを使用してリクエストからフィールドを抽出するまで、何も読み取りません。

最後に、他のフォームフィールドの値を取得する方法を見ることができます。


5結論

この記事では、SpringでApache Commonsファイルアップロードライブラリを使用して大きなファイルをアップロードおよび処理する方法について説明しました。

いつものように完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-rest-simple[GitHubでオーバー]を見つけることができます。