如何将多部分文件转换为文件?

任何人都可以告诉我什么是一个多部分文件(org.springframework.web.multipart.MultipartFile)转换为文件(java.io.File)的最佳方式?

在我的springmvc web项目我得到上传文件作为Multipart文件。我必须将其转换为文件(io),因此我可以调用这个图像存储服务( Cloudinary )。他们只能采取types(文件)。

我做了这么多的search,但失败了。如果有人知道一个好的标准方式,请让我知道? 日Thnx

您可以使用getBytes方法获取multipartFile的内容,并可以使用FileOutputStream类创buildFile类的实例。

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

您也可以使用transferTo方法 :

 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.web.multipart.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()); 

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字节的文件,请将multipartResolver中的maxInMemorySize更改为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> 

如果接口MultipartFile的类是CommonsMultipartFile则可以通过转换来访问Spring中的tempfile。

 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可以在@Configuration @EnableWebMvcmaxInMemorySize属性设置为0。 之后,所有上传的文件将被存储在磁盘上。

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

在@PetrosTsialiamanis文章, new File( multipart.getOriginalFilename())上的小更正,这将创build文件在服务器位置,有时你将面临用户的写权限问题,并不总是可以给每个执行操作的用户授予写权限。 System.getProperty("java.io.tmpdir")将创build临时目录,在那里你的文件将被正确地创build。 这样你正在创build临时文件夹,在哪里创build文件,以后可以删除文件或临时文件夹。

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

把这个方法放在你的常用工具中,用于例如。 Utility.multipartToFile(...)

Interesting Posts