Java中MultipartFile与File互转的实现
前言
需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用FormData表单的方式请求后台,后台接收类型是MultipartFile,放置文件过大时会造成内存溢出需要转换为File类型
MultipartFile转File
其实转换的本质都是要创建一个file的临时文件,然后通过各种实现方式将MultipartFile中的内容写入到file中
1.FileUtils.copyInputStreamToFile转换
package com.cxstar.file.util;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
public class FileTestUtils {
public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {
//获取文件名
String originalFilename = multipartFile.getOriginalFilename();
//获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
String tempDir = System.getProperty("user.dir");
//根目录下生成临时文件
File file = new File(tempDir+File.separator+originalFilename);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
return file;
}
}
此种方式的弊端就是需要在调用此方法后需要再手动删除,也就是要在业务代码中再掺杂删除的逻辑。
2.multipartFile.transferTo(tempFile);
public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {
//获取文件名
String originalFilename = multipartFile.getOriginalFilename();
//获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
String tempDir = System.getProperty("user.dir");
//获取文件名
String filename = StringUtils.substringBeforeLast(originalFilename, ".");
//获取文件后缀
String fileExt = StringUtils.substringAfterLast(originalFilename, ".");
//在项目根路径生成临时文件
File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));
multipartFile.transferTo(tempFile);
//在jvm退出时执行删除此路径下的文件
tempFile.deleteOnExit();
return tempFile;
}
注意:
1.防止生成的临时文件,createTempFile()方法会在文件名后添加随机码
2.生成的文件不会立马删除,而是在jvm退出时执行删除此路径下的文件
3. (推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
package com.cxstar.file.util;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
public class FileTestUtils {
public static File multiPartFileToFile3(MultipartFile multipartFile) {
File file = null;
if (multipartFile.isEmpty()) {
return null;
}
try {
//本质上还是在项目根路径创建文件
file = new File(multipartFile.getOriginalFilename());
//将MultipartFile的byte[]写入到file中
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
}
此种方式相较于第二种方式,文件名不会发生改变,当然还是要手动删除
File转MultipartFile
MultipartFile文件上传时,其实springmvc已经转为StandardMultipartFile子类型
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile
MultipartFile是一个接口,因此转成MultipartFile格式需要转成实现MultipartFile接口的实现类即可
package com.cxstar.file.util;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
public class FileTestUtils {
public static MultipartFile getMultipartFile(File file) throws Exception {
MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
return multipartFile;
}
到此这篇关于Java中MultipartFile与File互转的实现的文章就介绍到这了,更多相关Java MultipartFile与File互转内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341