multipartfile - read multipart file in java
¿Cómo convertir un archivo multiparte a File? (6)
¿Puede alguien decirme cuál es la mejor forma de convertir un archivo de varias partes (org.springframework.web.multipart.MultipartFile) en un archivo (java.io.File)?
En mi proyecto web Spring mvc, estoy subiendo archivos como archivos Multipart. Tengo que convertirlos a un archivo (io), por lo tanto, puedo llamar a este servicio de almacenamiento de imágenes ( Cloudinary ). Solo toman el tipo (archivo).
He realizado muchas búsquedas pero he fallado. Si alguien conoce una buena forma estándar, por favor avíseme. Thnx
Aunque la respuesta aceptada es correcta, pero si solo intenta subir su imagen a cloudinary, hay una forma mejor:
Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());
Donde multipartFile es tu org.springframework.web.multipart.MultipartFile .
La respuesta de Alex78191 ha funcionado para mí.
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;
}
Para cargar archivos con un tamaño superior a 10240 bytes, cambie maxInMemorySize en multipartResolver por 1 MB.
<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>
Puede acceder a tempfile en Spring mediante conversión si la clase de interfaz MultipartFile
es 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;
}
Para deshacerse del truco con archivos de menos de 10240 bytes, la propiedad maxInMemorySize
se puede establecer en 0 en la clase @Configuration
@EnableWebMvc
. Después de eso, todos los archivos cargados se almacenarán en el disco.
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxInMemorySize(0);
return resolver;
}
Puede obtener el contenido de multipartFile
utilizando el método getBytes
y puede crear una instancia de la clase File
utilizando la clase 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;
}
También puedes usar el método transferTo :
public File multipartToFile(MultipartFile multipart) throws IllegalStateException, IOException
{
File convFile = new File( multipart.getOriginalFilename());
multipart.transferTo(convFile);
return convFile;
}
También puede usar la biblioteca Apache Commons IO y la clase FileUtils . En caso de que esté usando maven, puede cargarlo usando la dependencia anterior.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
La fuente de MultipartFile guarda en el disco.
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());
pequeña corrección en la publicación @PetrosTsialiamanis, new File( multipart.getOriginalFilename())
esto creará el archivo en la ubicación del servidor donde en algún momento se enfrentarán problemas de escritura para el usuario, no siempre es posible dar permiso de escritura a cada usuario que realice una acción. System.getProperty("java.io.tmpdir")
creará el directorio temporal donde su archivo se creará correctamente. De esta manera está creando una carpeta temporal, donde se crea el archivo, más adelante puede eliminar el archivo o la carpeta temporal.
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;
}
ponga este método en su utilidad común y úselo como por ej. Utility.multipartToFile(...)