SpringBoot项目上传图片通常是上传至远程服务器存储,开发过程当中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传以后直接访问并不能被访问到,必须从新加载项目。html
首先分析一下缘由:java
咱们知道,若是使用相似 /upload/image/1.jpg 这种格式进行图片的访问的时候,SpringBoot读取的并非本项目中直接的静态目录,而是在进行编译的时候生成target目录下的文件,以下图所示:web
那么问题就来了,咱们在运行的过程当中上传一个图片的话,并不能从新加载当前这个项目,也就是target目录下的文件一直是以前的文件,尽管有人说我进行了SpringBoot热部署(dev-tools),可以自动从新加载项目,可是问题是热部署也须要必定的时间去分析和从新加载项目,因此上传文件后直接进行访问确定就不能实现了。服务器
简单来讲:文件只是单纯的上传到项目的文件夹中,并无在target目录下生成对应的文件,致使访问不到。ide
在网上看了一个博客,说能够在将文件复制到本地的时候也将文件复制到项目的target目录下,这样就能够访问了,听着也很是的有道理,可是实践出真知,通过个人测试,并不能实现,不知道是由于个人问题仍是什么,因此并不推荐你们使用这个方法,固然感兴趣的也能够测试一下,毕竟这个听着是真的颇有道理。函数
解决办法:配置映射路径拦截器,将虚拟路径映射为真是图片地址,达到回显的目的(已测试,有效)测试
简单来讲就是将UEditor要访问的路径映射成为本地的路径,废话很少说直接上代码:
注:SpringBoot1版本是extends WebMvcConfigurerAdapter类,SpringBoot2版本是implements WebMvcConfigurer,这个地方有点不同ui
1 @Override 2 public void addResourceHandlers(ResourceHandlerRegistry registry){ 3 registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); 4 registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); 5 registry.addResourceHandler("/static/ueditor/**").addResourceLocations("classpath:/static/ueditor/"); 6 registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/"); 7 registry.addResourceHandler("/static/upload/image/**").addResourceLocations("file:" + UploadUtils.getImgDirFile().getAbsolutePath() + "/"); //添加这一行 8 }
UploadUtils.javaspa
public class UploadUtils { // 项目根路径下的目录 -- SpringBoot static 目录至关因而根路径下(SpringBoot 默认) public final static String IMG_PATH_PREFIX = "static/upload/image"; public static File getImgDirFile(){ // 构建上传文件的存放 "文件夹" 路径 String fileDirPath = new String("src/main/resources/" + IMG_PATH_PREFIX); File fileDir = new File(fileDirPath); if(!fileDir.exists()){ // 递归生成文件夹 fileDir.mkdirs(); } return fileDir; } }
重点在于getAbsolutePath()方法,这个函数的做用是获取当前项目在当前运行环境下的绝对路径,如我如今在开发过程当中得到的结果就是D:\WorkSpace\IDEA-WorkSpace\......code
设置完毕以后就能够正常显示了。
注:若是你所使用的是SpringBoot多模块项目,那么经过这个方法获取到的每每是父项目所在的地址,所以也会出现问题,解决这个问题的办法是配置当前项目启动类的工做环境是在具体的某个项目
设置完毕后便可解决这个问题
附:以前在说这个问题的时候,也有人给我提了一个建议,就是不将图片放置在项目中,而是放置在某个固定的盘符中,这样返回请求路径的时候直接请求本地地址,等未来发布到服务器的时候使用Nginx。
不过问题是我对Nginx并非很了解,因此等我学会了Nginx以后再来完善这个博客吧,大家能够先替我试试好很差用。【手动滑稽】