MultipartFile 转File的几种方式
温馨提示:
本文最后更新于 2024年02月27日,已超过 299 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
前言
最近写项目有个需求是上传Excel文件并读取Excel文件中的内容,项目采用的是前后端分离的模式,前端采用FormData形式提交后台,后台接收类型是MultipartFile,但是我读取文件的时候类型是File,因为直接从MultipartFile里面获取流进行处理,文件过大时会造成内存溢出,所以需MultipartFile转File
一、MultipartFile转File
在将 MultipartFile 类型转换为file类型 时,一般都是新建临时文件夹,然后将其转换,可以指定路径新建,也可以建在项目根目录
二、代码示例
1.第一种方式
创建一个临时路径,转换之后得到File,然后再将其删除
File file = new File(path);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
2.第二种方式
此方法我在尝试的过程中一直报错,没成功,百度看到有这种方式,所以记录一下
public File transferToFile(MultipartFile multipartFile) {
// 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
file=File.createTempFile(filename[0], filename[1]);
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
3.第三种方式
这种方式会把上传的文件放到项目的根目录下,也要记得删啊
public File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
throw new ToLogException("读取文件错误", e);
}
}
总结
根据自己项目的需求选择一种方式吧,我是采用的第一种,代码比较简单
后续~
其实本身写这篇文章的时候只是单纯想记录一下,但是没想到被不少人收藏,也有一些童鞋给出了一些完善的观点,那我就再完善一下吧
1.首先第二种方式改为如下:
public File transferToFile(MultipartFile multipartFile) {
// 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
file=File.createTempFile(filename[0], filename[1] + ".");
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
filename[1]后面追加.
2.直接使用transferTo转换
// 先保存到临时文件夹下,操作完成之后进行删除
String filePath = Constants.TMP_PATH + DateUtil.getDateDir() + FileUtil.getFileName() + "." + suffix;
File targetFile = new File(filePath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
multipartFile.transferTo(targetFile);
其实这个跟第二种方式差不多,如果上传的是临时文件的话,其实还是得删除的
正文到此结束