1、问题描述

当我们使用springboot时,都会遇到文件上传这个功能,当我们使用transferTo()进行文件转存时,又遇到一系列的问题:

先上一个代码:email和username的这两个参数不需要管,我们本次就单独来看headerImg但文件上传和photos的多文件上传问题:

    @PostMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos) throws IOException {
        log.info("上传的信息:email={},username={},headerImg={},photos={}",email,username,headerImg.getSize(),photos.length);
        String path = "./src/main/resources/cache";
        if(!headerImg.isEmpty()){
            String filename = headerImg.getOriginalFilename();

            headerImg.transferTo(new File(path+"/"+filename));
        }
        if(photos.length > 0){
            for (MultipartFile photo : photos) {
                if(!photo.isEmpty()){
                    String filename = photo.getOriginalFilename();
                    photo.transferTo(new File(path+"/"+filename));
                }
            }
        }
        return "main";
    }

我们在上传后存储过程中, 通常我们都想把它放在当前文件根目录的resources文件中(本次我打算把它放在resources下自己新建的cache文件夹存放)

这时,我们都会选择使用相对路径来确定目标位置,此时运行后会报一个错误:(若使用绝对路径就没问题)

 它说我们的路径找不到:/private/var/folders/fq/y2td_36x7cs9449xg9tdpf6m0000gn/T/tomcat.8080.12427067138093864755/work/Tomcat/localhost/ROOT/./src/main/resources/cache/id-正.png (No such file or directory)

我们发现其中多了一串其他的路径信息

这是因为transferTo()方法,会判断你传进来的是否是相对路径,如果是,则会使用他的temp路径作为本次路径的父目录,然后将我们的路径一起转换为绝对路径!

2、解决方法

1、获取相对路径的绝对路径

2、将获得的绝对路径+文件名一起传进去就可以完美解决!

示例:

    @PostMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos) throws IOException {
        log.info("上传的信息:email={},username={},headerImg={},photos={}",email,username,headerImg.getSize(),photos.length);
        String path = "./src/main/resources/cache";
        String destPath = new File(path).getAbsolutePath();
        if(!headerImg.isEmpty()){
            String filename = headerImg.getOriginalFilename();

            headerImg.transferTo(new File(destPath+"/"+filename));
        }
        if(photos.length > 0){
            for (MultipartFile photo : photos) {
                if(!photo.isEmpty()){
                    String filename = photo.getOriginalFilename();
                    photo.transferTo(new File(destPath+"/"+filename));
                }
            }
        }
        return "main";
    }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐