MultipartFile.transferTo(targetFile)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MultipartFile.transferTo(targetFile)相关的知识,希望对你有一定的参考价值。
参考技术A 时间:2020.12.4异常:java.io.FileNotFoundException: /home/jdp/apache-tomcat-8.5.54-8-group/apache-tomcat-8.5.54-80 /work/Catalina/localhost/ROOT/upload_cda0de04_fa66_4589_8170_5cb0cb7f8152_00000005.tmp
初步判断:文件上传路径问题,但是项目路径中并未配置这个路径,后面了解到 /work 是tomcat 编译文件的临时路径,联想到 /work 之后的文件可能是上传的临时文件路径,而前面的路径是tomcat的绝对路径
探索1:项目配置的文件路径为/home/temp, 可能是因为tomcat的临时文件路径和我们上传的临时文件路径不匹配导致的
尝试1:设置tomcat 临时文件路径 在 application.properites 中配置 增加配置 server.tomcat.basedir=/home/temp
结果1:未解决,报错不变
探索2:查阅资料得知 MultipartFile.transferTo(targetFile) 方法是面向绝对路径的,如果入参是一个相对路径,则会在路径之前加上 一个系统绝对路径(比较符合我们的情况)
尝试2:根据文章所述:增加配置类 指定临时文件的路径
@Configuration
public class FileUploadConfig
@Value("$file.temp.root")
private String FILE_TEMP_ROOT;
/**
* 文件上传配置
*
* @return MultipartConfigElement
*/
@Bean
public MultipartConfigElement multipartConfigElement(
@Value("$multipart.maxFileSize") String maxFileSize,
@Value("$multipart.maxRequestSize") String maxRequestSize)
MultipartConfigFactory factory = new MultipartConfigFactory();
// 单个文件最大
factory.setMaxFileSize(maxFileSize);
// 设置总上传数据总大小
factory.setMaxRequestSize(maxRequestSize);
//上传临时路径
File file = new File(FILE_TEMP_ROOT);
if (!file.exists())
file.mkdirs();
factory.setLocation(FILE_TEMP_ROOT);
return factory.createMultipartConfig();
结果2:报错发生变化,变成了我们的指定的路径加上 临时文件名,但是依旧未能解决问题
java.io.FileNotFoundException: /home/temp/upload_a8eb4246_470f_4f73_81af_891f1ad6651b_00000002.tmp
转换思路:既然是transferTo()方法的问题,换一个方法
探索3:更换transferTo()方法,使用 FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);方法
尝试3:寻找方法中包涵的transfTo()方法,替换成FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);
结果3:问题解决
总结:transferTo()在windows 系统上并没有这个问题,在Linux上出现了这个问题,网上的资料各有说法,目前未找到真正的原因。为了避免这个问题,统一使用FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);方法来复制文件。
[转]spring MultipartFile 转 File
原文地址:https://www.jianshu.com/p/6cf99d39e170
File.createTempFile(String prefix, String suffix);
创建一个临时File对象,或者new File()
MultipartFile.transferTo(File dest);
实现 MultipartFile to File
@RequestMapping("/uploadDutyExcelNew")
@ResponseBody
public String uploadDutyExcel(HttpServletRequest request,
@RequestParam("file") MultipartFile multfile) throws Exception {
// 获取文件名
String fileName = multfile.getOriginalFilename();
// 获取文件后缀
String prefix=fileName.substring(fileName.lastIndexOf("."));
// 用uuid作为文件名,防止生成的临时文件重复
final File excelFile = File.createTempFile(UUIDGenerator.getUUID(), prefix);
// MultipartFile to File
multfile.transferTo(excelFile);
//你的业务逻辑
//程序结束时,删除临时文件
deleteFile(excelFile);
return "";
}
/**
* 删除
*
* @param files
*/
private void deleteFile(File... files) {
for (File file : files) {
if (file.exists()) {
file.delete();
}
}
}
以上是关于MultipartFile.transferTo(targetFile)的主要内容,如果未能解决你的问题,请参考以下文章