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

  • Post author:
  • Post category:java





前言

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

接收小程序上传的图片,并保存到阿里云服务器中,提供一个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,但是图片确实存在

在这里插入图片描述



自己写一个配置类

既然第一种思路不可以,我尝试了第二种,继承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,并添加资源位置。

在路径问题中,三个反斜杠可有可无(通过我这边自己证明),如果遇到无效的情况,大家可以尝试三个反斜杠。

哦对了,最后一点,设置资源位置的时候


一定不要忘了在最后加反斜杠!

一定不要忘了在最后加反斜杠!!

一定不要忘了在最后加反斜杠!!!


加油!

以上。



版权声明:本文为weixin_41463193原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。