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

}
相关推荐
爱上语文4 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
荆州克莱6 分钟前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
serve the people8 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政6 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
拾光师7 小时前
spring获取当前request
java·后端·spring
Java小白笔记9 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
小哇6669 小时前
Spring Boot,在应用程序启动后执行某些 SQL 语句
数据库·spring boot·sql
JOJO___10 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
白总Server11 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php
luoluoal11 小时前
java项目之企业级工位管理系统源码(springboot)
java·开发语言·spring boot