Как сконвертировать файл multipart в файл?
может ли кто-нибудь сказать мне, что такое лучший способ конвертировать составной файл (org.springframework.сеть.составной.MultipartFile) в файл (java.Ио.Файл)?
в моем весеннем веб-проекте mvc я получаю загруженный файл как составной файл.Я должен преобразовать его в файл (io), поэтому я могу вызвать эту службу хранения изображений(Cloudinary).Они принимают только тип (файл).
Я сделал так много поисков, но не удалось.Если кто-нибудь знает хороший стандартный способ, пожалуйста, позвольте мне знаешь? Спасибо!
6 ответов
вы можете получить контент 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;
}
вы также можете использовать способ трансферто:
public File multipartToFile(MultipartFile multipart) throws IllegalStateException, IOException
{
File convFile = new File( multipart.getOriginalFilename());
multipart.transferTo(convFile);
return convFile;
}
хотя принятый ответ верен, но если вы просто пытаетесь загрузить свое изображение в cloudinary, есть лучший способ:
Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());
где multipartFile ваш org.springframework.сеть.составной.MultipartFile.
вы также можете использовать 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());
небольшая коррекция на @ PetrosTsialiamanis post ,
new File( multipart.getOriginalFilename())
это создаст файл в местоположении сервера, где когда-нибудь вы столкнетесь с проблемами разрешения на запись для пользователя, не всегда возможно дать разрешение на запись каждому пользователю, который выполняет действие.
System.getProperty("java.io.tmpdir")
создаст временный каталог, в котором ваш файл будет создан правильно.
Таким образом, вы создаете папку temp, где создается файл, позже вы можете удалить файл или temp папка.
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(...)
ответ 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>
вы можете получить доступ к tempfile весной путем литья, если класс интерфейса 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;
}