Может ли кто-нибудь сказать мне, как лучше всего преобразовать составной файл (org.springframework.web.multipart.MultipartFile) в файл (java.io.File)?
В моем весеннем веб-проекте mvc я загружаю файл в виде файла Multipart. Мне нужно преобразовать его в файл (io), поэтому я могу вызвать эту службу хранения изображений ( Cloudinary ). Они принимают только тип (File).
Я сделал так много поисков, но потерпел неудачу. Если кто-нибудь знает хороший стандартный способ, дайте мне знать? Спасибо
java
spring
spring-mvc
file-upload
cloudinary
Амила Иддамалгода
источник
источник
MultipartFile.transferTo()
?Ответы:
Вы можете получить содержимое a
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); }
источник
createNewFIle()
здесь бессмысленно и расточительно. Теперь вы обязуетесьnew FileOutputStream()
(через ОС) как удалить созданный таким образом файл, так и создать новый.небольшое исправление в сообщении @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(...)
источник
Хотя принятый ответ правильный, но если вы просто пытаетесь загрузить свое изображение в облачную среду, есть способ лучше:
Где multipartFile - это ваш org.springframework.web.multipart.MultipartFile .
источник
Вы также можете использовать библиотеку ввода-вывода Apache Commons и класс 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());
источник
FileUtils.touch()
здесь бессмысленно и расточительно. Теперь вы обязуетесьnew FileOutputStream()
(через ОС) как удалить созданный таким образом файл, так и создать новый.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();
Ознакомьтесь с комментарием Раззлеро о File.deleteOnExit (), выполняемом при выходе из JVM (что может быть крайне редко), подробности ниже.
источник
deleteOnExit()
, он сработает только при завершении работы JVM, поэтому не будет запускаться во время исключений. Из-за этого вам нужно быть осторожным при использованииdeleteOnExit()
в долго работающих приложениях, таких как серверные приложения. Для серверных приложений JVM редко завершает работу. Поэтому нужно быть осторожным, чтобы неdeleteOnExit()
вызвать утечки памяти. JVM необходимо отслеживать все файлы, которые необходимо удалить при выходе, которые не очищаются, поскольку JVM не завершает работу.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; }
источник
Вы можете получить доступ к временному файлу весной литья , если класс интерфейса
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; }
источник
createNewFIle()
здесь бессмысленно и расточительно. Теперь вы обязуетесьnew FileOutputStream()
(через ОС) как удалить созданный таким образом файл, так и создать новый.Ответ 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>
источник
maxInMemorySize
не имеет ничего общего с ограничением на размер загружаемого файла. Размер загружаемого файла задается вmaxUploadSize
собственности.maxInMemorySize
prop можно установить значение0
.если вы не хотите использовать 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) }
источник