项目场景:

前台上传图片到后台

简单说说我的需求,前端上传文件(拿图片举例)到后台,服务器保存文件到本地,前端想要直接通过访问url来请求图片资源。


问题描述:

如何权衡资源存储和资源访问?

我们都知道外部用户若要通过url来访问服务器资源,该资源应该是放在项目的静态资源当中,但若直接将文件保存在此项目的静态资源中,可能会使jar包过大,且造成程序和数据不分离以及上传图片路径复杂等问题。如此一来,就产生了资源存储和资源访问的矛盾。


解决方案:

Springboot为我们提供了静态资源映射的功能,可以将资源传到服务器本地的某个路径下,然后将该路径映射为静态资源。


具体实操:

1.静态资源配置:
(1)可选:application.yml(或.properties)文件配置

web:
  uploadPath: /www/wwwroot/images/  # Win: D:/IdeaProjects/forum/images/  linux: /www/wwwroot/images/

在这里插入图片描述

这里为了便于本地测试和后续发布,我将Windows电脑和linux服务器中的选定路径都写了上去,这样本地测好以后,直接将注释里面的linux路径改上去就可以发布了。你如果没有这种需求或者嫌麻烦,可以直接看第二步。
(2)创建配置类
在这里插入图片描述
静态资源目录一览:
我想要外部能访问到的图片就是在static/images/下的,不过我们并不想直接将图片上传到这下面(原因如前述)。
在这里插入图片描述

由于我是Springboot 2.x,使用的方式是在配置类中实现WebMvcConfigurer接口,代码如下:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Value("${web.uploadPath}")   //application.yml中配置的
    private String baseUploadPath;   

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:"+baseUploadPath);
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

其功能是:
将所有/images/** 访问都映射到file:baseUploadPath(即主机本地的选定目录中);
addResourceLocations的每一个值必须以’/'结尾,否则虽然映射了,但是依然无法访问该目录下的的文件(支持: classpath:/xxx/xx/, file:/xxx/xx/, http://xxx/xx/)
(3)接下来就是上传文件,具体方法可以参考各种资料,我这里只提一点,就是上传路径可以填写自己选定的目录,并将该图片文件的外部访问url存入数据库或者返回给前端,见下图:
①上传路径:
上传路径
②外部访问url
在这里插入图片描述
(4)使用postman测试
在这里插入图片描述
上传图片后查看/www/wwwroot/images目录:
在这里插入图片描述
接下来使用url访问一下,可以访问到
在这里插入图片描述
以上就是Springboot部署到linux服务器应该如何进行静态资源映射并通过url访问。有任何疑问欢迎评论区交流!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐