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

}
相关推荐
morris13129 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
paopaokaka_luck5 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风7 小时前
详解K8S--声明式API
后端
Peter_chq7 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml47 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~7 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端