springboot 文件MultipartFile上传路径问题

本文介绍了在SpringBoot中使用`transferTo()`方法进行文件上传时遇到的路径问题。当使用相对路径时,会因Tomcat的临时目录导致找不到文件。解决方法是获取相对路径的绝对路径,并结合文件名使用`transferTo()`保存文件。通过提供绝对路径,可以避免路径错误,确保文件正确存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值