谁能告诉我将多部分文件 (org.springframework.web.multipart.MultipartFile) 转换为文件 (java.io.File) 的最佳方法是什么?
在我的 spring mvc web 项目中,我将上传的文件作为 Multipart 文件。我必须将其转换为 File(io),因此我可以调用此图像存储服务( Cloudinary )。它们只采用类型(File)。
我做了很多搜索但失败了。如果有人知道一个好的标准方法,请告诉我?谢谢
谁能告诉我将多部分文件 (org.springframework.web.multipart.MultipartFile) 转换为文件 (java.io.File) 的最佳方法是什么?
在我的 spring mvc web 项目中,我将上传的文件作为 Multipart 文件。我必须将其转换为 File(io),因此我可以调用此图像存储服务( Cloudinary )。它们只采用类型(File)。
我做了很多搜索但失败了。如果有人知道一个好的标准方法,请告诉我?谢谢
您可以MultipartFile
使用该getBytes
方法获取 a 的内容,并且可以使用以下方法写入文件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);
}
@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(...)
尽管接受的答案是正确的,但如果您只是想将图像上传到 cloudinary,那么有更好的方法:
Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());
multipartFile 是您的org.springframework.web.multipart.MultipartFile。
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;
}
MultipartFile.transferTo(File) 很好,但毕竟不要忘记清理临时文件。
// 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();
在下面查看 Razzlero 关于在 JVM 退出时执行的 File.deleteOnExit() 的评论(这可能非常罕见)细节。
您还可以使用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());
MultipartFile
如果接口的类是,您可以通过强制转换访问 Spring 中的临时文件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
可以在@Configuration
@EnableWebMvc
类中将属性设置为 0。之后,所有上传的文件都将存储在磁盘上。
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxInMemorySize(0);
return resolver;
}
使用 Apache Commons 的单行答案。
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
MultipartFile 可以获取 InputStream。
multipartFile.getInputStream()
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.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)
}