1. springboot版本 2.7.4
  2. 开发工具 IDEA 2021.2.4

1. SpringBoot提供的默认静态资源访问方法

resouces目录下的

/static、 /public、 /resouces、 /META-INF/resouces、

这四个目录下放置的静态资源都可以通过直接通过以下链接访问

http://localhost:8080/aaa.png

springboot 配置ipv6地址 springboot配置服务器地址_spring boot

2. 将SpringBoot静态资源访问路径配置到本机地址

一般我们都要将程序打包部署到服务器上,可能并不想使用springboot提供的默认的静态资源目录,想将服务的某个目录设为静态资源目录,如服务器的 /root/abc/static,可以进行如下配置

2.1 在配置文件中(application.yml文件)填写的路径和访问前缀

save-path 和 mapping-path 中最后的 / 一定不能少!

image:
  save-path: /root/static/ # 图片存储路径
  mapping-path: /img/ # 图片的 RequestMapping 的路径

save-path 和 mapping-path 中最后的 / 一定不能少!(在啰嗦一遍)
mapping-path 指的是最后通过url访问静态资源的时候所需要加的前缀
例如
http://localhost:8080/img/aaa.png

2.2 更改springboot拦截器

在以下位置创建java文件(文件位置其实是可以任意的)

springboot 配置ipv6地址 springboot配置服务器地址_spring boot_02

MyWebAppConfiguration文件

package com.atguigu.mybatisplus.config;


import org.springframework.beans.factory.annotation.Value;
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 MyWebAppConfiguration implements WebMvcConfigurer {
//    @Value("${upload.file.location}")
//    private String fileLocation;
//    @Value("${upload.file.path}")
//    private String filePath;

    @Value("${image.save-path}")
    private String imageSavePath;
    /***图标映射路径*/
    @Value("${image.mapping-path}")
    private String imageMappingPath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(imageMappingPath + "**").addResourceLocations("file:" + imageSavePath);
    }

}

2.3 配置文件上传接口

@Controller
@RestController
@RequestMapping("/mybatisplus/user")
public class UserController {
    /*** 图片存储路径 */
    @Value("${image.save-path}")
    private String imageSavePath;
    /*** 图片映射路径 */
    @Value("${image.mapping-path}")
    private String imageMappingPath;

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile fileUpload) {
        //获取文件名
        String fileName = fileUpload.getOriginalFilename();
        //获取文件后缀名。也可以在这里添加判断语句,规定特定格式的图片才能上传,否则拒绝保存。
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //为了避免发生图片替换,这里使用了文件名重新生成
        fileName = UUID.randomUUID() + suffixName;
        try {
            // 将图片保存到文件夹里
            fileUpload.transferTo(new File(imageSavePath + fileName));
            // 返回文件 Mapping 路径,使用 http://IP:端口/下面返回的路径 ,即可在网页中查看图片
            return imageMappingPath + fileName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

3.将项目部署到服务器的docker中

springboot 配置ipv6地址 springboot配置服务器地址_java_03


docker本身也可以理解成是运行在服务器上的服务器(如上图所示),它在运行时有自己的内部环境,若将静态资源直接放在docker中,那么存储在docker中的资源会随着容器的销毁而销毁,因此需要进行docker的文件映射,将docker的 /root/static 映射到服务器的 /root/abc/static中, 相当于创建了一个共享文件夹,这样当容器销毁时,里面的文件依然会在 本机的 /root/abc/static中保留。

关于docker的静态资源映射,可以在创建容器的时候进行设置

docker-compose.yml文件

version: '2'
services:
  xz-platform:
    build:
      context: .
    restart: always
    ports:
      - 10204:8080
    volumes:
      - /root/xz-platform/static:/root/static  # 在这里做的映射,前面的地址是本机地址,后面的地址是容器的地址,顺序不要弄混
    container_name: xz-platform
    hostname: xz-platform
    image: xz-platform

PS:

  1. 容器内部的 /root/static文件夹是默认存在的,不需要进入手动创建
  2. 进入运行springboot项目的容器内部的指令为
docker exec -it 容器id sh

使用

docker exec -it 容器id bash

docker exec -it 容器id /bin/bash

都是不行的