104

マルチパートファイル (org.springframework.web.multipart.MultipartFile) をファイル (java.io.File) に変換する最良の方法は何ですか?

私の春のmvc Webプロジェクトでは、アップロードされたファイルをマルチパートファイルとして取得しています.File(io)に変換する必要があるため、この画像保存サービス( Cloudinary )を呼び出すことができます.タイプ(File)のみを取ります.

私は非常に多くの検索を行いましたが、失敗しました.誰かが良い標準的な方法を知っているなら、私に知らせてください? thnx

4

11 に答える 11

12

MultipartFile.transferTo(File) は便利ですが、一時ファイルをきれいにすることを忘れないでください。

// ask JVM to ask operating system to create temp file
File tempFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_POSTFIX);

// ask JVM to delete it upon JVM exit if you forgot / can't delete due exception
tempFile.deleteOnExit();

// transfer MultipartFile to File
multipartFile.transferTo(tempFile);

// do business logic here
result = businessLogic(tempFile);

// tidy up
tempFile.delete();

以下の JVM 終了時に実行される File.deleteOnExit() に関する Razzlero のコメント (非常にまれな場合があります) の詳細を確認してください。

于 2019-02-19T09:20:38.693 に答える
9

Apache Commons IOライブラリとFileUtils クラスも使用できます。Maven を使用している場合は、上記の依存関係を使用してロードできます。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

ディスクに保存する MultipartFile のソース。

File file = new File(directory, filename);

// Create the file using the touch method of the FileUtils class.
// FileUtils.touch(file);

// Write bytes from the multipart file to disk.
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
于 2016-05-16T16:48:37.857 に答える
2

インターフェースのクラスMultipartFileCommonsMultipartFile.

public File getTempFile(MultipartFile multipartFile)
{
    CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile;
    FileItem fileItem = commonsMultipartFile.getFileItem();
    DiskFileItem diskFileItem = (DiskFileItem) fileItem;
    String absPath = diskFileItem.getStoreLocation().getAbsolutePath();
    File file = new File(absPath);

    //trick to implicitly save on disk small files (<10240 bytes by default)
    if (!file.exists()) {
        file.createNewFile();
        multipartFile.transferTo(file);
    }

    return file;
}

10240 バイト未満のファイルでトリックを取り除くには、クラスmaxInMemorySizeでプロパティを 0 に設定できます。@Configuration @EnableWebMvcその後、アップロードされたすべてのファイルがディスクに保存されます。

@Bean(name = "multipartResolver")
    public CommonsMultipartResolver createMultipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        resolver.setMaxInMemorySize(0);
        return resolver;
    }
于 2016-07-09T11:14:39.567 に答える
0

Alex78191 による答えは私にとってはうまくいきました。

public File getTempFile(MultipartFile multipartFile)
{

CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile;
FileItem fileItem = commonsMultipartFile.getFileItem();
DiskFileItem diskFileItem = (DiskFileItem) fileItem;
String absPath = diskFileItem.getStoreLocation().getAbsolutePath();
File file = new File(absPath);

//trick to implicitly save on disk small files (<10240 bytes by default)

if (!file.exists()) {
    file.createNewFile();
    multipartFile.transferTo(file);
}

return file;
}

サイズが 10240 バイトを超えるファイルをアップロードするには、multipartResolver の maxInMemorySize を 1MB に変更してください。

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- setting maximum upload size t 20MB -->
<property name="maxUploadSize" value="20971520" />
<!-- max size of file in memory (in bytes) -->
<property name="maxInMemorySize" value="1048576" />
<!-- 1MB --> </bean>
于 2016-12-29T05:09:08.833 に答える
0

MultipartFile は InputStream を取得できます。

multipartFile.getInputStream()

于 2021-10-25T05:06:21.447 に答える