java图片上传保存至服务器并返回可下载的URL
java图片上传保存至服务器并返回可下载的URL
- 1.需求来源
- 2.解决思路
- 3.开始干活(直接上代码)
- 4.总结
1.需求来源
上周要做一个功能,需求是: 微信小程序开发的程序会传一张图片到后台java接口,后台接收到图片保存在数据库。起先,我们是用图片转换成base64编码然后保存在数据库。但是,这样数据量大了以后,传输和查询特别慢。后面改为对上传的图片进行处理,保存到服务器本地文件夹中,并且生成一个可以直接访问的url路径中过程的思考?
2.解决思路
要实现的功能其实看起来也很简单呀。主要是思路。前一部分接口接收到图片保存到本地服务器指定目录下,这个毫无问题。关键是:根据图片生成一个可以访问的URL路径,用于前端展示。
第一步,将图片保存到本地,并且根据保存的路径生成一个绝对路径。
第二步,开一个服务,启一个端口(注:服务与图片放在同一个服务器上面),用于获取服务器上面的图片。
第三步,浏览器访问IP地址+端口+图片路径。从上到下是一个思考的过程,想想没毛病。但是,我用这种方式,自己在浏览器作测试,怎么访问都是404,想想肯定是哪里错了。最后,根据度娘的指引,看到了WebMvcConfigurationSupport这个类(可以自定义资源映射路径)。在这个类里面定义一个虚拟路径对应的真实路径即可,访问通过虚拟路径访问,映射到真实路径,这样我们在接口访问的时候,直接会连接到本地的真实路径里获取图片。我们还可以写个拦截器,限制访问来源和接口参数验证,对于防止恶意攻击有好处,剩下的可以自由发挥。
3.开始干活(直接上代码)
1.新建springboot项目,写一个上传类
package com.file.upload.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.nio.charset.Charset;
import java.util.List;
/**
* @Author: Mr sheng.z
* @Description:
* @Date: Create in 10:11 2019/11/26
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
//上传的图片在D盘下的downLoad目录下,访问路径如:http://localhost:8899/downLoad/d3cf0281-bb7f-40e0-ab77-406db95ccf2c.jpg
//file作用 指定文件传输协议 获取电脑文件一般都是file
registry.addResourceHandler("/downLoad/**").addResourceLocations("file:D:\\picturePath\\");
super.addResourceHandlers(registry);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
.allowedOrigins("*")
//是否允许证书 不再默认开启
.allowCredentials(true)
//设置允许的方法
.allowedMethods("GET", "POST", "PUT", "DELETE")
//跨域允许时间
.maxAge(3600);
}
/**
* 全局设置编码格式
* @return
*/
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
}
3.postman接口测试参数
4.浏览器访问效果
4.总结
我们采用这种方式的好处就是我们即达到了我们想要的效果,又隐藏了我们真实的物理路径,保证了安全性,而且这样如果后期需要外网访问的话,直接配置一个外网映射即可。
这个过程中主要是第三步,如果不知道有这个可以配置映射关系的话,可能我们只能用一些成熟的服务,比如七牛云,影像服务等太过于麻烦。有点,杀鸡焉用牛刀的感觉。
下面附上项目源码地址:上传服务源码
欢迎大家关注我的个人公众号一起成长,一起进步 。本人比较才疏学浅,如有错误,欢迎指正
原文地址: https://blog.csdn.net/Z__Sheng/article/details/103256464
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章