SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述:

使用springboot开发一个项目,开发文件上传的时候,通常会将上传的文件存储到资源目录下的static里面,然后在本地测试上传文件功能没有问题,但是将项目打成jar包放到服务器上运行的时候就会报错,找不到对应目录。或者可以将上传文件存储到和jar包同级的目录下,但是无法通过http访问到文件

2.项目打成jar包后如何设置文件资源存储路径

!!!保存上传的资源文件路径,路径在部署jar包同级目录

java 复制代码
//这里 /img/uploadFile/ 可以更改为不同层级的目录,可以跟开发时的静态目录统一
    String path = System.getProperty("user.dir")+"/static/img/uploadFile/";
    File dir = new File(path);
// 如果不存在则创建目录
    if(!dir.exists()){
        dir.mkdirs();
      }

3.设置http访问上传的静态资源文件

在项目中创建一个config包,然后新建一个java类uploadConfig,用来设置上传的路径

java 复制代码
package com.curry.config;
 
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 uploadConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/","file:static/");
    }
}

接下来就可以通过http://ip:port/img/uploadFile/test.png来访问该文件了

如果static的目录结构和项目里面的一样的话,就跟访问打jar包前一样访问即可,相当于通过目录结构访问相应的文件。

完整代码

java 复制代码
package com.xxx.xxx.xxxx.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;

@Controller
@RequestMapping("/admin")
public class UploadController {

    @RequestMapping("/upload")
    public String upload(MultipartFile file,
                         Model model) throws IOException {

        //校验文件是否为空
        if (file.isEmpty()){
            model.addAttribute("path","请选择文件上传!");
            return "admin/upload";
        }
        //图片重命名,防止图片名称重复,可以使用时间戳或者UUID生成,我这里不需要担心文件名重复,所以没做
        String originalFilename = file.getOriginalFilename();
        String filename = originalFilename;

        //上传图片,并判断是否有年份文件夹
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
//        String pre = System.getProperty("user.dir") + "/src/main/resources/static/img/paper/" + year +"/";
        String pre = System.getProperty("user.dir") + "/static/img/paper/" + year +"/";

        //file.mkdir创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
        File file1 = new File(pre);
        file1.mkdir();


        String path = pre + filename;
        file.transferTo(new File(path));

        model.addAttribute("path",path);
        return "admin/upload";
    }

}
相关推荐
小鸡脚来咯13 分钟前
RESTful API 面试详解
后端·面试·restful
吴巴格15 分钟前
springboot引用其他中间件,如何确定版本
spring boot·后端·中间件
IT_陈寒22 分钟前
Vue3性能优化实战:5个被低估的API让我减少了40%的代码量
前端·人工智能·后端
vx_bisheyuange26 分钟前
基于SpringBoot的旅游管理系统
前端·javascript·vue.js·spring boot·毕业设计
岁岁种桃花儿28 分钟前
Spring Boot项目核心配置:parent父项目详解(附实操指南)
java·spring boot·spring
IT=>小脑虎30 分钟前
AI时代下后端的出路在哪?
人工智能·后端·学习
想摆烂的不会研究的研究生30 分钟前
每日八股——Redis(4)
数据库·经验分享·redis·后端·缓存
YYHPLA31 分钟前
【无标题】
java·spring boot·后端·缓存
sunnyday042636 分钟前
深入理解分布式锁:基于Redisson的多样化锁实现
spring boot·redis·分布式
EricLee39 分钟前
2025 年终总结 - Agent 元年
前端·人工智能·后端