【Java入坑之路】已解决,SpringBoot虚拟路径映射没效果是怎么回事

文章目录

    • 前言
    • 正文
            • 添加配置文件
            • 自己写一个配置类
    • 补充一点:
    • 总结


前言

还是在弄一个小东西,里面有一个需求是这样的:

接收小程序上传的图片,并保存到阿里云服务器中,提供一个URL实现图片的访问

比如,我把图片1.jpg保存到服务器的

/usr/local/apache-tomcat-8.5.39/webapps/ROOT/images/图片1.jpg

然后可以通过以下地址访问

https://xxx.cn/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,但是图片确实存在
【Java入坑之路】已解决,SpringBoot虚拟路径映射没效果是怎么回事_第1张图片

自己写一个配置类

既然第一种思路不可以,我尝试了第二种,继承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,成功访问
【Java入坑之路】已解决,SpringBoot虚拟路径映射没效果是怎么回事_第2张图片


补充一点:

网上说addResourceLocations(“file:目录”) 中的file需要加三个反斜杠
即变成addResourceLocations(“file:///目录”) ,我也尝试了,发现我这边的情况是三个反斜杠是可以的,不加三个反斜杠也是可以的
但是还有一点需要注意一下:

如果是Linux的绝对路径,那么file:后面就需要四个反斜杠或者一个反斜杠

比如

addResourceLocations(“file:////usr/local/xxx/”)
addResourceLocations(“file:/usr/local/xxx/”)

这两种是可以的,但是我试过直接写三个反斜杠是不可以的,比如

addResourceLocations(“file:///usr/local/xxx/”)

至于为什么不可以,大家可以从转义的角度思考


总结

在这个坑中,我试了几种方案,最后发现添加配置文件在我这里还是行不通,只好自己写一个类继承WebMvcConfigurationSupport,并添加资源位置。
在路径问题中,三个反斜杠可有可无(通过我这边自己证明),如果遇到无效的情况,大家可以尝试三个反斜杠。
哦对了,最后一点,设置资源位置的时候
一定不要忘了在最后加反斜杠!
一定不要忘了在最后加反斜杠!!
一定不要忘了在最后加反斜杠!!!

加油!

以上。

你可能感兴趣的:(Java)