Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете получить содержимое 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);
}

Ответ 2

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

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

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

Ответ 3

небольшая коррекция на пост @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(...)

Ответ 4

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

Ответ 5

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

Ознакомьтесь с комментарием Razzlero о File.deleteOnExit(), выполняемом при выходе из JVM (что может быть крайне редко), подробности ниже.

Ответ 6

Вы можете получить доступ к временному файлу в 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;
    }

Ответ 7

Ответ от 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>

Ответ 8

если вы не хотите использовать 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)
    }

Ответ 9

  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;
    }