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)的主要内容,如果未能解决你的问题,请参考以下文章

MultipartFile文件上传问题