web-dev-qa-db-ja.com

マルチパートファイルをファイルに変換する方法は?

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

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

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

71

MultipartFileメソッドを使用してgetBytesの内容を取得し、Files.newOutputStream()を使用してファイルに書き込むことができます。

public void write(MultipartFile file, Path dir) {
    Path filepath = Paths.get(dir.toString(), file.getOriginalFilename();

    try (OutputStream os = Files.newOutputStream(filepath)) {
        os.write(file.getBytes());
    }
}

transferToメソッド を使用することもできます。

public void multipartFileToFile(
    MultipartFile multipart, 
    Path dir
) throws IOException {
    Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename());
    multipart.transferTo(filepath);
}
172

受け入れられた答えは正しいですが、画像をcloudinaryにアップロードしようとしている場合は、より良い方法があります。

Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());

ここで、multipartFileはorg.springframework.web.multipart.MultipartFileです。

11
Heisenberg

@PetrosTsialiamanis postの小さな修正、new File( multipart.getOriginalFilename())これは、ユーザーの書き込み許可の問題に直面するサーバーの場所にファイルを作成します。アクションを実行するすべてのユーザーに書き込み許可を与えることが常に可能とは限りません。 System.getProperty("Java.io.tmpdir")は、ファイルが適切に作成される一時ディレクトリを作成します。このようにして、ファイルが作成される一時フォルダーを作成し、後でファイルまたは一時フォルダーを削除できます。

public  static File multipartToFile(MultipartFile multipart, String fileName) throws IllegalStateException, IOException {
    File convFile = new File(System.getProperty("Java.io.tmpdir")+"/"+fileName);
    multipart.transferTo(convFile);
    return convFile;
}

このメソッドをur共通ユーティリティに入れて、たとえばUtility.multipartToFile(...)

9
Swadeshi

Apache Commons IO ライブラリと FileUtilsクラス を使用することもできます。 Mavenを使用している場合は、上記の依存関係を使用して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());
2

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 if you forgot / can't due exception
tempFile.deleteOnExit();

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

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

// tidy up
tempFile.delete();
1
andrej

インターフェイスMultipartFileのクラスがCommonsMultipartFileの場合、キャストすることでSpringのtempfileにアクセスできます。

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プロパティを@Configuration@EnableWebMvcクラスで0に設定します。その後、アップロードされたすべてのファイルはディスクに保存されます。

@Bean(name = "multipartResolver")
    public CommonsMultipartResolver createMultipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        resolver.setMaxInMemorySize(0);
        return resolver;
    }
0
Alex78191

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>
0
Anand Tagore

multipartFile.transferTo()を使用したくない場合。このようなファイルを書くことができます

    val dir = File(filePackagePath)
    if (!dir.exists()) dir.mkdirs()

    val file = File("$filePackagePath${multipartFile.originalFilename}").apply {
        createNewFile()
    }

    FileOutputStream(file).use {
        it.write(multipartFile.bytes)
    }
0
Artem Botnev
  private File convertMultiPartToFile(MultipartFile file ) throws IOException
    {
        File convFile = new File( file.getOriginalFilename() );
        FileOutputStream fos = new FileOutputStream( convFile );
        fos.write( file.getBytes() );
        fos.close();
        return convFile;
    }
0