任何一个可以告诉我什么是转换一个多文件(org.springframework.web.multipart.MultipartFile)到文件(java.io.File的)的最好方法?
在我的Spring MVC的Web项目我得到上传的文件多部分file.I必须将其转换为一个文件(IO),还有前我可以调用这个图像存储服务(Cloudinary)。他们只需要类型(文件)。
我已经做了这么多的搜索,但failed.If任何人知道一个很好的标准方式,请让我知道? 日Thnx
任何一个可以告诉我什么是转换一个多文件(org.springframework.web.multipart.MultipartFile)到文件(java.io.File的)的最好方法?
在我的Spring MVC的Web项目我得到上传的文件多部分file.I必须将其转换为一个文件(IO),还有前我可以调用这个图像存储服务(Cloudinary)。他们只需要类型(文件)。
我已经做了这么多的搜索,但failed.If任何人知道一个很好的标准方式,请让我知道? 日Thnx
你可以得到的内容MultipartFile
使用getBytes
方法,你可以写使用文件Files.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());
}
}
您还可以使用的transferTo方法 :
public void multipartFileToFile(
MultipartFile multipart,
Path dir
) throws IOException {
Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename());
multipart.transferTo(filepath);
}
虽然接受的答案是正确的,但如果你只是想上传图片到cloudinary,有一个更好的方法:
Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());
其中multipartFile是您org.springframework.web.multipart.MultipartFile。
在@PetrosTsialiamanis后小幅回调, new File( multipart.getOriginalFilename())
在服务器位置,这将创建文件,其中的某个时候,你将面对的写权限问题对于用户来说,它并不总是能够给写权限,谁执行操作的每个用户。 System.getProperty("java.io.tmpdir")
将创建您的文件将被正确创建临时目录。 这样,您所创建的临时文件夹,在文件被创建,以后你可以删除文件或临时文件夹。
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(...)
你也可以使用Apache的百科全书IO库和文件实用程序类 。 如果你正在使用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
。
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
属性可以在设置为0 @Configuration
@EnableWebMvc
类。 在此之后,所有上传的文件将被存储在磁盘上。
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxInMemorySize(0);
return resolver;
}
MultipartFile.transferTo(文件)是好的,但不要忘了清理临时文件后所有。
// 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 if you forgot / can't due exception
tempFile.deleteOnExit();
// transfer MultipartFile to File
multipartFile.transferTo(tempFile);
// do business logic here
result = businessLogic(tempFile);
// tidy up
tempFile.delete();
如果你不希望使用MultipartFile.transferTo()。 你可以这样写文件
val dir = File(filePackagePath)
if (!dir.exists()) dir.mkdirs()
val file = File("$filePackagePath${multipartFile.originalFilename}").apply {
createNewFile()
}
FileOutputStream(file).use {
it.write(multipartFile.bytes)
}
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;
}