java图片上传保存至服务器并返回可下载的URL

2022-05-25 00:00:00 返回 保存 图片上传

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接口测试参数
《java图片上传保存至服务器并返回可下载的URL》

4.浏览器访问效果《java图片上传保存至服务器并返回可下载的URL》

4.总结

我们采用这种方式的好处就是我们即达到了我们想要的效果,又隐藏了我们真实的物理路径,保证了安全性,而且这样如果后期需要外网访问的话,直接配置一个外网映射即可。
这个过程中主要是第三步,如果不知道有这个可以配置映射关系的话,可能我们只能用一些成熟的服务,比如七牛云,影像服务等太过于麻烦。有点,杀鸡焉用牛刀的感觉。
下面附上项目源码地址:上传服务源码

欢迎大家关注我的个人公众号一起成长,一起进步 。本人比较才疏学浅,如有错误,欢迎指正

《java图片上传保存至服务器并返回可下载的URL》

    原文作者:张Sir66666
    原文地址: https://blog.csdn.net/Z__Sheng/article/details/103256464
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章