1、报错案例代码
后端:
public UploadRes upLoadFile(MultipartFile file, String savePath) {
UploadRes uploadRes = new UploadRes();
try {
File saveDir = new File(savePath).getParentFile();
// 判断路径是否存在,如果不存在就创建一个
if (saveDir != null && !saveDir.exists()) {
saveDir.mkdirs();
}
file.transferTo(new File(savePath));
uploadRes.setFlag(true);
uploadRes.setResFilePath(savePath);
uploadRes.setMsg("文件上传成功");
uploadRes.setOriFileName(file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
uploadRes.setFlag(false);
uploadRes.setMsg("文件存储失败");
}
return uploadRes;
}
本例运行时参数
savePath为相对路径/home/upload/aaa.jpg
在执行file.transferTo(new File(savePath))时,报错提示
FileNotFoundException: C:\Users\XXX\AppData\Local\Temp\tomcat.9095.675054628671612619\work…(系统找不到指定的路径)。
2、修改后代码示例
public UploadRes upLoadFile(MultipartFile file, String savePath) {
UploadRes uploadRes = new UploadRes();
try {
// File saveDir = new File(savePath).getParentFile();
// // 判断路径是否存在,如果不存在就创建一个
// if (saveDir != null && !saveDir.exists()) {
// saveDir.mkdirs();
// }
//
// file.transferTo(new File(savePath));
// 相对路径转绝对路径进行保存,防止相对路径找不到临时文件
File dest = new File(new File(savePath).getAbsolutePath());
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
uploadRes.setFlag(true);
uploadRes.setResFilePath(savePath);
uploadRes.setMsg("文件上传成功");
uploadRes.setOriFileName(file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
uploadRes.setFlag(false);
uploadRes.setMsg("文件存储失败");
}
return uploadRes;
}
此时运行提交,代码没有报错,文件上传成功。
运行时new File(savePath).getAbsolutePath()后,可以debugger看到文件路径为D:\home\upload\aaa.jpg
3、问题分析:
可以通过参数看到,错误案例时,上传文件的路径为相对路径。成功的案例因为多new File转为绝对路径。
file.transferTo(dest);会根据dest文件的实例化路径去做处理。判断如果是相对路径,则使用temp目录,就是上诉报错的C:\Users\XXX\AppD…。如果是绝对路径就可以找到直接运输保存到新文件。
当然本例仅为file.transferTo(dest)方法的修复,也可以通过其他方式,
如:引入
commons-io
commons-io
2.5
调用如下的方法
FileUtils.copyInputStreamToFile(MultipartFile.getInputStream(),destFile);
经过调试应该也是可以的。
学海无涯苦作舟!!!