Come convertire un file multipart in File?

Qualcuno può dirmi qual è il modo migliore per convertire un file multipart (org.springframework.web.multipart.MultipartFile) in File (java.io.File)?

Nel mio progetto web mvc di spring sto ricevendo il file caricato come file Multipart. Devo convertirlo in un file (io), quindi posso chiamare questo servizio di archiviazione di immagini ( Cloudinary ). Prendono solo tipo (File).

Ho fatto così tante ricerche ma ho fallito. Se qualcuno conosce un buon modo standard, fammi sapere? thnx

È ansible ottenere il contenuto di multipartFile utilizzando il metodo getBytes ed è ansible creare un’istanza della class File utilizzando la class 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; } 

Puoi anche utilizzare il metodo transferTo :

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

Sebbene la risposta accettata sia corretta, ma se stai solo cercando di caricare la tua immagine su cloud, c’è un modo migliore:

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

Dove multipartFile è il tuo org.springframework.web.multipart.MultipartFile .

È anche ansible utilizzare la libreria IO di Apache Commons e la class FileUtils . Nel caso in cui si utilizzi Maven, è ansible caricarlo utilizzando la dipendenza di cui sopra.

  commons-io commons-io 2.4  

La sorgente per MultipartFile salva su 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()); 

piccola correzione sul post @PetrosTsialiamanis, new File( multipart.getOriginalFilename()) questo creerà il file nella posizione del server dove a volte si affronteranno problemi di authorization di scrittura per l’utente, non è sempre ansible dare il permesso di scrittura a tutti gli utenti che eseguono azioni. System.getProperty("java.io.tmpdir") creerà la directory temporanea in cui il file verrà creato correttamente. In questo modo stai creando una cartella temporanea, in cui il file viene creato, in seguito puoi eliminare il file o la cartella temporanea.

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

metti questo metodo nella tua comune utilità e usalo come per es. Utility.multipartToFile(...)

La risposta di Alex78191 ha funzionato per me.

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

Per caricare file di dimensioni superiori a 10240 byte, modificare maxInMemorySize in multipartResolver su 1 MB.

        

Puoi accedere a tempfile in Spring mediante il cast se la class di interfaccia 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; } 

Per eliminare il trucco con file inferiori a 10240 byte, la proprietà maxInMemorySize può essere impostata su 0 nella class @Configuration @EnableWebMvc . Dopodiché, tutti i file caricati verranno archiviati su disco.

 @Bean(name = "multipartResolver") public CommonsMultipartResolver createMultipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("utf-8"); resolver.setMaxInMemorySize(0); return resolver; }