it-roy-ru.com

Как преобразовать файл из нескольких частей в файл?

Кто-нибудь может сказать мне, каков наилучший способ конвертировать многокомпонентный файл (org.springframework.web.multipart.MultipartFile) в файл (Java.io.File)?

В моем весеннем веб-проекте MVC я получаю загруженный файл как файл Multipart. Я должен преобразовать его в файл (IO), поэтому я могу вызвать этот сервис хранения изображений ( Cloudinary ). Они принимают только тип ( Файл).

Я сделал так много поисков, но не смог. Если кто-нибудь знает хороший стандартный способ, пожалуйста, дайте мне знать? Thnx

66
Amila Iddamalgoda

Вы можете получить содержимое multipartFile с помощью метода getBytes и создать экземпляр класса File с помощью класса FileOutputStream.

public File convert(MultipartFile file)
{    
    File convFile = new File(file.getOriginalFilename());
    convFile.createNewFile(); 
    FileOutputStream fos = new FileOutputStream(convFile); 
    fos.write(file.getBytes());
    fos.close(); 
    return convFile;
}

Вы также можете использовать метод TransferTo :

public File multipartToFile(MultipartFile multipart) throws IllegalStateException, IOException 
{
    File convFile = new File( multipart.getOriginalFilename());
    multipart.transferTo(convFile);
    return convFile;
}
162
Petros Tsialiamanis

Хотя принятый ответ правильный, но если вы просто пытаетесь загрузить свое изображение в облачный сервис, есть лучший способ:

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

Где multipartFile - это ваш org.springframework.web.multipart.MultipartFile .

9
Heisenberg

небольшое исправление в сообщении @PetrosTsialiamanis, 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(...)

7
Swadeshi

Вы также можете использовать библиотеку 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());
2
George Siggouroglou

Вы можете получить доступ к tempfile в Spring при помощи приведения, если класс интерфейса MultipartFile равен CommonsMultipartFile.

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;
    }
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 байт, измените значение maxInMemorySize в multipartResolver на 1 МБ.

<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
sachintha hewawasam

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();
0
andrej