在开发一个基于Springboot的项目时,遇到了一个问题,那就是如何让前端访问到存储在后端项目中的图片,我首先想到的是Springboot的静态资源映射(后来发现不能用静态资源映射去解决我的需求)。
需求
前端上传了图片(例如头像)后,后端把图片存储了起来,然后需要返回访问该图片的URL,使前端(或浏览器)通过该URL显示该图片。
静态资源映射
后端把上传的图片存储在项目的static目录下:
然后写了一个配置类,去映射静态资源
java 代码解读复制代码@Configuration
public class WebConfig implements WebMvcConfigurer {
//静态资源映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**");
}
}
然后运行项目,发现可以访问到 localhost:8089/img/avatar/3.jpg,
但是在项目运行过程中,在前端上传了4.jpg,但无法通过localhost:8089/img/avatar/4.jpg 去访问。于是我重启项目,代码没有改动,发现 localhost:8089/img/avatar/4.jpg 可以访问到了。
结论:Springboot的静态文件资源目录 static/ 下的文件的确可以访问到,前提是该文件在项目打成jar包前就存在,而我们运行Springboot项目,本质就是把java项目打包jar然后运行。而在项目运行过程中,新添加在static目录下的文件,根本就不在项目运行的jar包,所以根本无法访问得到。
所以头像等动态添加的文件是不可以放在static目录下,Springboot默认的静态资源映射是映射静态文件!即项目运行后就不会改变的文件。
文件映射(回显图片)
java 代码解读复制代码@Configuration
public class WebConfig implements WebMvcConfigurer {
//资源映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//资源映射, /img路由 对应机器上的E:/myProject/forum_server/
// Springboot会自动去E:/myProject/forum_server/查找对应的文件
registry.addResourceHandler("/img/**").addResourceLocations("file:E:\\myProject\\forum_server\\");
}
}
可以通过 localhost:8089/img/avatar/3.jpg 去访问到图片。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。