# SpringBoot 上传图片 url 回显

在 application.yml 中进行配置存储路径

image-20240524163702247

创建图片上传的 controller 类

package com.dkx.mpj.controller;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
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.text.SimpleDateFormat;
import java.util.Date;
 
import java.util.UUID;
 
@RestController
public class imgController {
    /**
     * 时间格式化
     */
    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");
 
    /**
     * 图片保存路径,自动从 yml 文件中获取数据
     *   示例: E:/images/
     */
 
    @Value("${file-save-path}")
    private String fileSavePath;
    @PostMapping("/upload")
    public String uploadFile(MultipartFile file, HttpServletRequest request) {
        // 后半段目录:  2020/03/15
        String directory = simpleDateFormat.format(new Date());
        /**
         * 文件保存目录  E:/images/2020/03/15/
         * 如果目录不存在,则创建
         */
 
        File dir = new File(fileSavePath + directory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        System.out.println("图片上传,保存位置:" + fileSavePath + directory);
        // 给文件重新设置一个名字
        // 后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String newFileName= UUID.randomUUID().toString().replaceAll("-", "")+suffix;
 
        // 创建这个新文件
        File newFile = new File(fileSavePath + directory + newFileName);
        // 复制操作
        try {
            file.transferTo(newFile);
            // 协议 ://ip 地址 :端口号 / 文件目录 (/images/2020/03/15/xxx.jpg)
            String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/images/" + directory + newFileName;
            System.out.println("图片上传,访问URL:" + url);
            return url;
        } catch (IOException e) {
            return e.getMessage();
        }
    }
}

配置映射路径 (重点)

image-20240524163519757

package com.dkx.mpj.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 WebConfig implements WebMvcConfigurer {
 
    /**
     * 图片保存路径,自动从 yml 文件中获取数据
     *   示例: E:/images/
     */
    @Value("${file-save-path}")
    private String fileSavePath;
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 配置资源映射
         * 意思是:如果访问的资源路径是以 “/images/” 开头的,
         * 就给我映射到本机的 “E:/images/” 这个文件夹内,去找你要的资源
         * 注意:E:/images/ 后面的 “/” 一定要带上
         */
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:"+fileSavePath);
    }
}

这里需要说明一下,如果使用了 security 那么就会拦截接口,此时我们需要在 security 的配置类中去放行 /images/** 路径即可

测试结果:

image-20240524163804296