# SpringBoot 上传图片 url 回显
在 application.yml 中进行配置存储路径
创建图片上传的 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(); | |
} | |
} | |
} |
配置映射路径 (重点)
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/** 路径即可
测试结果: