美文网首页
MultipartFile.transferTo(targetF

MultipartFile.transferTo(targetF

作者: 97度的开水 | 来源:发表于2020-12-15 09:21 被阅读0次

时间: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);方法来复制文件。

相关文章

网友评论

      本文标题:MultipartFile.transferTo(targetF

      本文链接:https://www.haomeiwen.com/subject/ftvqhktx.html