参考大佬博客的链接https://www.cnblogs.com/zimug/p/13474233.html

        SpringBoot版本:2.3.7.RELEASE 发布时间:2022年3月

介绍:

        在自己做一些小项目的时候遇到一个保存图片的问题,很明显,单独去买一个服务器保存图片划不着,而保存到数据库效率太低了。

网上查到的保存方法大多数分两种:

        一种是直接保存到项目路径下面,这样的话,一旦服务重新部署保存的图片直接就G了。

        另一种是保存到其他路径,这里介绍的就是保存到其他路径的方法。

分析:

        其实保存与读取关心的无非两点,保存路径读取路径

实现方式:

一、配置Static-location实现方式

学过SpringBoot web场景的应该都清楚spring.resources.static-location可以配置静态资源访问路径,这里我们就重写这个属性,在原本四个静态路径的基础上添加上一个保存图片的地址就好了。

static-location的配置:

web:
  upload-path: G:/images

spring:
  resources:
    static-locations: file:${web.upload-path},classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

        upload-path就是保存图片的位置,在下面添加静态资源位置的时候,需要加上file:,告诉springboot这是文件中的路径。

接下来是Controller

@RestController
@Slf4j
public class FormTestController {
    //获取yaml中配置的上传路径属性
    @Value(("${web.upload-path}"))
    private String uploadPath;

    @PostMapping("/upload")
    public String upload(@RequestPart("file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();  //获取文件原名
        String visibleUri="/"+fileName;     //拼接访问图片的地址
        String saveUri=uploadPath+"/"+fileName;        //拼接保存图片的真实地址

        log.info("图片原文件名={} 图片访问地址={} 图片保存真实地址={}",fileName,visibleUri,saveUri);

        File saveFile = new File(saveUri);
        //判断是否存在文件夹,不存在就创建,但其实可以直接手动确定创建好,这样不用每次保存都检测
        if (!saveFile.exists()){
            saveFile.mkdirs();
        }
        try {
            file.transferTo(saveFile);  //保存文件到真实存储路径下
        } catch (IOException e) {
            e.printStackTrace();
        }

        return visibleUri;
    }

}

前端的body

<body>
<h1>这是首页</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
    上传文件:<input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>
<img src="/插画1.jpg">
<img src="/插画2.jpg">
<img src="/插画3.jpg">
<img src="/插画4.jpg">

</body>

因为我们把保存图片的地址配置为了静态资源路径,所以/**就可以直接访问到其中的图片了。

使用效果:见文章下面的第三部分。

二、配置addResourceHandlers实现方式

        一个配置导入WebMvcConfigurer接口就可以成为web配置类,这个是springboot的常识。

        而其中的addResourceHandlers()是添加资源处理器的方法,其实上面的配置static-location本质上也是被这个方法处理的,这个可以自己查看源码。

        而我们在web配置类中重写这个方法也可以添加资源处理器。

这里将配置属性保存到application.properties中,没有其他原因,单纯因为刚才yaml用过了。

application.properties


thk.imagesRealPath=G:/images/ #真实保存地址
thk.imagesServerPath=/images #访问地址

上面两个地址的名字可以自己取

真实保存地址:就是你保存到那个盘下的那个文件夹,一定要注意文件夹的路径

访问地址:就是你访问这张图片时要加的前缀

config类

@Configuration
public class MyWebConfig implements WebMvcConfigurer  {
    //获取真实路径和访问路径
    @Value("${thk.imagesRealPath}")
    private String realPath;
    @Value("${thk.imagesServerPath}")
    private String serverPath;

    //添加文件服务器位置
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(new String[]{serverPath+"/**"}).addResourceLocations("file:/"+realPath);
}

        这种方式唯一可以说的优点是,你不用把那四个静态资源文件夹再写一遍……

Html的body部分

<body>
<h1>这是首页</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
    上传文件:<input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>
<img src="images/插画1.jpg">
<img src="images/插画2.jpg">
<img src="images/插画3.jpg">
<img src="images/插画4.jpg">

</body>

我们配置了访问路径为images,所以就要加上它了。

三、static-location的使用效果:

html

图片保存位置

上传图片

 上传成功

前端浏览

 如果还有疑问可以留言,也欢迎大佬交流!

Logo

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

更多推荐