Adakah yang bisa memberi tahu saya apa cara terbaik untuk mengonversi file multi bagian (org.springframework.web.multipart.MultipartFile) ke File (java.io.File)?
Dalam proyek web mvc musim semi saya, saya mendapatkan file yang diunggah sebagai file Multipart. Saya harus mengubahnya menjadi File (io), oleh karena itu saya dapat memanggil layanan penyimpanan gambar ini ( Cloudinary ). Mereka hanya mengambil jenis (File).
Saya telah melakukan begitu banyak pencarian tetapi gagal. Jika ada yang tahu cara standar yang baik, beri tahu saya? Thnx
java
spring
spring-mvc
file-upload
cloudinary
Amila Iddamalgoda
sumber
sumber
MultipartFile.transferTo()
?Jawaban:
Anda bisa mendapatkan konten a
MultipartFile
dengan menggunakangetBytes
metode ini dan Anda bisa menulis ke file menggunakanFiles.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()); } }
Anda juga dapat menggunakan metode transferTo :
public void multipartFileToFile( MultipartFile multipart, Path dir ) throws IOException { Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename()); multipart.transferTo(filepath); }
sumber
createNewFIle()
tidak ada gunanya dan sia-sia di sini. Anda sekarang mewajibkannew FileOutputStream()
(melalui OS) untuk menghapus file yang sudah dibuat dan membuat yang baru.Meskipun jawaban yang diterima benar tetapi jika Anda hanya mencoba mengunggah gambar Anda ke cloudinary, ada cara yang lebih baik:
Di mana multipartFile adalah org.springframework.web.multipart.MultipartFile Anda .
sumber
koreksi kecil pada posting @PetrosTsialiamanis,
new File( multipart.getOriginalFilename())
ini akan membuat file di lokasi server di mana terkadang Anda akan menghadapi masalah izin menulis untuk pengguna, tidak selalu memungkinkan untuk memberikan izin tulis kepada setiap pengguna yang melakukan tindakan.System.getProperty("java.io.tmpdir")
akan membuat direktori temp di mana file Anda akan dibuat dengan benar. Dengan cara ini Anda membuat folder temp, tempat file dibuat, nanti Anda dapat menghapus file atau folder 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; }
letakkan metode ini di utilitas umum Anda dan gunakan seperti untuk misalnya.
Utility.multipartToFile(...)
sumber
Anda juga dapat menggunakan pustaka Apache Commons IO dan kelas FileUtils . Jika Anda menggunakan maven, Anda dapat memuatnya menggunakan dependensi di atas.
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
Sumber untuk MultipartFile simpan ke disk.
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());
sumber
FileUtils.touch()
tidak ada gunanya dan sia-sia di sini. Anda sekarang mewajibkannew FileOutputStream()
(melalui OS) untuk menghapus file yang sudah dibuat dan membuat yang baru.MultipartFile.transferTo (File) bagus, tapi jangan lupa untuk membersihkan file temp.
// 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();
Lihat komentar Razzlero tentang File.deleteOnExit () yang dieksekusi setelah keluar dari JVM (yang mungkin sangat jarang) detail di bawah ini.
sumber
deleteOnExit()
, ini hanya akan terpicu saat JVM dihentikan, jadi tidak akan terpicu selama pengecualian. Karena itu, Anda perlu berhati-hati menggunakandeleteOnExit()
aplikasi yang berjalan lama seperti aplikasi server. Untuk aplikasi server, JVM jarang keluar. Jadi, Anda perlu berhati-hati agar tidakdeleteOnExit()
menyebabkan kebocoran memori. JVM perlu melacak semua file yang perlu dihapus saat keluar yang tidak dihapus karena JVM tidak berhenti.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; }
sumber
Anda dapat mengakses tempfile di Spring dengan mentransmisikan jika kelas antarmukanya
MultipartFile
adalahCommonsMultipartFile
.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; }
Untuk menghilangkan trik dengan file kurang dari 10240 byte
maxInMemorySize
properti dapat diatur ke 0 di@Configuration
@EnableWebMvc
kelas. Setelah itu, semua file yang diunggah akan disimpan di disk.@Bean(name = "multipartResolver") public CommonsMultipartResolver createMultipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("utf-8"); resolver.setMaxInMemorySize(0); return resolver; }
sumber
createNewFIle()
tidak ada gunanya dan sia-sia di sini. Anda sekarang mewajibkannew FileOutputStream()
(melalui OS) untuk menghapus file yang sudah dibuat dan membuat yang baru.Jawaban oleh Alex78191 berhasil untuk saya.
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; }
Untuk mengunggah file yang berukuran lebih dari 10240 byte, harap ubah maxInMemorySize di multipartResolver menjadi 1MB.
<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>
sumber
maxInMemorySize
tidak ada hubungannya dengan batasan ukuran upload file. Ukuran unggahan file ditentukan olehmaxUploadSize
properti.maxInMemorySize
prop dapat diatur ke0
.jika Anda tidak ingin menggunakan MultipartFile.transferTo (). Anda dapat menulis file seperti ini
val dir = File(filePackagePath) if (!dir.exists()) dir.mkdirs() val file = File("$filePackagePath${multipartFile.originalFilename}").apply { createNewFile() } FileOutputStream(file).use { it.write(multipartFile.bytes) }
sumber