栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 upload(MultipartFile file, HttpServletRequest request) throws IOException {
        //获取上传图片的原始名称
        String filename=file.getOriginalFilename();
        //获取上传文件的图片大小
        long size = file.getSize();
        //获取上传文件的mime类型
        String contentType = file.getContentType();
        Map 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站老师的比较简单,实验结果我帮你们对比分析结束,下课!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292459.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号