SpringBoot文件上传之jar包路径问题

前言

当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源。但是当你使用SpringBoot的jar包发布项目的时候,你会发现,你不能像以前一样操作文件了。其实原因你也想的到,你无法对jar包里面的资源进行操作,而对于springboot项目来说,你只能读取里面的文件,只能使用InputStream。

解决办法

因为我们无法操作jar包内容,所以我们只能将文件存放在别的位置,与jar包同级的目录是一个不错的选择。
这是一个重点也是必须掌握的知识,IDEA运行和jar包运行是不同的,这篇博客主要目的是解决遗留问题:SpringBoot实现文件上传与下载
废话少说,上代码:项目结构:
在这里插入图片描述
controller包的Upload代码:

package com.shmily.ldx.controller;


import com.shmily.ldx.MyContent.MyContent;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
public class Upload {

    @RequestMapping("/upload")
    public Map<String,String> upload(MultipartFile file, HttpServletRequest request) throws IOException {
        //获取上传图片的原始名称
        String filename=file.getOriginalFilename();
        //获取上传文件的图片大小
        long size = file.getSize();
        //获取上传文件的mime类型
        String contentType = file.getContentType();
        Map<String,String> map=new HashMap<>();
        if(file.isEmpty()){
            map.put("code","200");
            map.put("reason","您上传的文件为空");
            return map;
        }
        //获取当前目录所在位置
        String root= MyContent.PRO_PATH;

        File img = new File(root, "img");

        if(!img.exists()){
            img.mkdirs();
        }

        //获取当前时间戳
        long time = new Date().getTime();
        String replace= UUID.randomUUID().toString().replace("-","");
        String newFilename = time + "-" + replace + filename.substring(filename.lastIndexOf("."));
        file.transferTo(new File(root+File.separator+"img"+File.separator,newFilename));

        map.put("code","200");
        map.put("reason","您的照片已被我们收录");
        map.put("path",root);
        return map;
    }
}

MyContent包下的MyContent类代码:

package com.shmily.ldx.MyContent;


public class MyContent {
    //日期格式化模板字符串
    public static final String DATE_FORMAT_STR="yyyy-MM-dd HH:mm:ss";
    //系统文件路径分隔符
    public static final String FILE_SER = System.getProperty("file.separator");
    //项目路径
    public static final String PRO_PATH = System.getProperty("user.dir");
    //文件存储目录名
    public static final String UPLOAD_DIR="upload";
    //文件上传存储路径
    public static final String UPd1LOAD_PATH=PRO_PATH+FILE_SER+UPLOAD_DIR;
    //随机路径取值基础字符串(16进制)
    public static final String HEX_STR="0123456789ABCDEF";

}

重点在这里,webmvcconfig下的WebMvcConfig的代码,做的是访问(URL请求访问)路径映射,MyContent.PRO_PATH为自己封装的项目具体路径

package com.shmily.ldx.webmvcconfig;

import com.shmily.ldx.MyContent.MyContent;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //客户端访问地址前缀
        registry.addResourceHandler("/static/**")
                .addResourceLocations("file:"+ MyContent.PRO_PATH+"/img/");
    }
}

没什么可说的,不懂的留言即可

测试结果实验奉上:(测试工具是postman)

首先展示在IDEA中运行文件路径效果,再测试jar包的

在这里插入图片描述
postman上传图片:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上传发送:成功!!!
在这里插入图片描述
来看看img文件的位置
在这里插入图片描述
明显与src包或target包同级
文件目录:
在这里插入图片描述
再测试一下映射后的路径能访问吗,成功!!!
在这里插入图片描述

好,我们测试jar包运行条件

Maven打包
在这里插入图片描述
运行jar包
在这里插入图片描述
同样的方式用postman上传
在这里插入图片描述
成功上传,注意这里我返回的img文件夹位于的路径
在这里插入图片描述
在这里插入图片描述
文件夹情况:

在这里插入图片描述
相同的访问方式:访问IDEA实验时上传的图片,成功访问不到
在这里插入图片描述
原因在于jar包中没有这张图片,它只位于IEDA的项目包下,并不是jar包
访问我们jar包环境下上传的图片:
毫无疑问肯定成功!!!
在这里插入图片描述
代码是b站老师的比较简单,实验结果我帮你们对比分析结束,下课!!!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CharmDeer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值