如何将多部分文件转换为文件?
任何人都可以告诉我什么是一个多部分文件(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
@EnableWebMvc
类maxInMemorySize
属性设置为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(...)