【Java入坑之路】已解决,SpringBoot虚拟路径映射没效果是怎么回事
前言
还是在弄一个小东西,里面有一个需求是这样的:
接收小程序上传的图片,并保存到阿里云服务器中,提供一个URL实现图片的访问
比如,我把图片1.jpg保存到服务器的
/usr/local/apache-tomcat-8.5.39/webapps/ROOT/images/图片1.jpg
然后可以通过以下地址访问
由于SpringBoot是直接上手的,对其基础掌握的不是很好,在实现这个功能的时候遇到了一些坑,通过这篇博客记录一下。
正文
查了百度,实现这个功能的方法就是配置虚拟路径映射,网上的方法大致分为两种:
-
在application.properties中添加两行(三行)配置代码;
-
自己写一个配置类,继承WebMvcConfigurationSupport,重写addResourceHandlers方法。
按照一些网友的提示,两种方法任选一种即可。
添加配置文件
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/, classpath:/static/, classpath:/public/,file:${/usr/local/apache-tomcat-8.5.39/webapps/ROOT/images/}
在application.properties中添加上面两行代码,
为了避免出错,第二行代码中的file值,我添加的是绝对路径。
用IDEA导成jar包并上传到服务器,发现输入图片的URL之后,弹出404,但是图片确实存在
自己写一个配置类
既然第一种思路不可以,我尝试了第二种,继承WebMvcConfigurationSupport,并重写addResourceHandlers方法,代码如下:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class UploadConfiguration extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**")//这个将应用到url中
.addResourceLocations("file:/usr/local/apache-tomcat-8.5.39/webapps/ROOT/images");//这里填的是图片的绝对父路径
super.addResourceHandlers(registry);
}
}
用IDEA导成jar包并上传到服务器,打开URL之后还是弹出404
仔细检查了一下,最后发现在addResourceLocations中少写了一个反斜杠,修改后的addResourceLocations方法如下:
.addResourceLocations("file:/usr/local/apache-tomcat-8.5.39/webapps/ROOT/images/");//这里填的是图片的绝对父路径
即在images末尾的地方加上反斜杠,说明要访问的文件是在images目录下的文件中
重新上传到服务器,输入URL,成功访问
补充一点:
网上说addResourceLocations(“file:目录”) 中的file需要加三个反斜杠
即变成addResourceLocations(“file:///目录”) ,我也尝试了,发现我这边的情况是三个反斜杠是可以的,不加三个反斜杠也是可以的
但是还有一点需要注意一下:
如果是Linux的绝对路径,那么file:后面就需要四个反斜杠或者一个反斜杠
比如
addResourceLocations(“file:////usr/local/xxx/”)
addResourceLocations(“file:/usr/local/xxx/”)
这两种是可以的,但是我试过直接写三个反斜杠是不可以的,比如
addResourceLocations(“file:///usr/local/xxx/”)
至于为什么不可以,大家可以从转义的角度思考
总结
在这个坑中,我试了几种方案,最后发现添加配置文件在我这里还是行不通,只好自己写一个类继承WebMvcConfigurationSupport,并添加资源位置。
在路径问题中,三个反斜杠可有可无(通过我这边自己证明),如果遇到无效的情况,大家可以尝试三个反斜杠。
哦对了,最后一点,设置资源位置的时候
一定不要忘了在最后加反斜杠!
一定不要忘了在最后加反斜杠!!
一定不要忘了在最后加反斜杠!!!
加油!
以上。