SpringBoot实现本地文件存储及预览过程

 更新时间:2022年11月16日 16:42:00   作者:青年人责任  
这篇文章主要介绍了SpringBoot实现本地文件存储及预览过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、前言

若使用本机存储来存放文件资源

核心实现过程:

  • 上传文件,保存文件(本地磁盘)
  • 返回文件HTTP访问服务器路径给前端,进行效果展示

二、储备

服务端接收上传的目的是提供文件的访问服务,对于SpringBoot而言,其对静态资源访问提供了很好的支持,使用其提供的基本默认配置可以满足开发需求,同时,又支持开发人员进行自定义配置。

SpringBoot默认将 / 所有访问映射到一下目录:**

classpath:/META-INF/resources
classpath:/static
classpath:/public
classpath:/resources

在src/main/resources下新建pubic、resources、static三个文件夹,分别放入x.png、xx.png、xxx.png三张图片

如下:

启动项目后,分别访问:

http://localhost:9999/x.png
http://localhost:9999/xx.png
http://localhost:9999/xxx.png

正常返回图片资源。

说明,SpringBoot默认会挨个从pubic、resources、static里面找是否存在相应的资源,如果有则直接返回。

可以看出这里的静态资源都在classpath下。

那么就出现问题:

  • 应用的文件资源不能和项目代码分开存储
  • 项目打包困难,当上传的文件越来越多,项目的打包jar越来越大
  • 代码与文件数据不能分开存储,就意味着文件数据的备份将变得复杂

三、方案

SpringBoot为我们提供了 spring.resources.static-locations 配置自定义静态文件的位置:

spring:
    web:
        resources:
          static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${demo.web.upload-path}
 
demo:
  web:
    upload-path: D:/data/
  • 配置 demo.web.upload-path 为与项目代码分离的静态资源路径,即:文件上传保存根路径
  • 配置 spring.web.resources.static-locations 除了带上SpringBoot默认的静态资源路径之外,加上file:${demo.web.upload-path}指向外部的文件资源上传路径,即:该路径下的静态资源可以直接对外提供HTTP访问服务

四、Java Code

public String upload(MultipartFile file, HttpServletRequest request) {
        if (file == null) {
            throw new BizException("参数为空");
        }
        // 在 uploadPath 文件夹中通过日期对上传的文件归类保存
        // 例如:/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
        String format = sdf.format(new Date());
        File folder = new File(uploadPath + format);
        if (!folder.isDirectory()) {
            folder.mkdirs();
        }
 
        // 对上传的文件重命名, 避免文件重名
        String oldName = file.getOriginalFilename();
        String newName = UUID.randomUUID().toString()
                + oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            // 文件保存
            file.transferTo(new File(folder, newName));
 
            // 返回上传文件的访问路径
            // 例如:http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
            String filePath = request.getScheme() + "://" + request.getServerName()
                    + ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;
 
            return filePath;
        } catch (IOException e) {
            throw new BizException("系统错误");
        }
 
    }

五、模拟文件

将此 upload.html 文件放到 classpath:public 目录下,对外提供访问。

如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="请选择上传文件">
    <input type="submit" value="保存">
</form>
</body>
</html>

访问测试,点击"选择文件",之后"保存":

文件被保存到服务端的 demo.web.upload-path 指定的资源目录下

浏览器端响应结果如下,返回一个文件HTTP访问路径:

http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png

使用该HTTP访问路径,在浏览器端访问效果如下。

证明我们的文件已经成功上传到服务端,以后需要访问该图片就通过这个HTTP URL就可以了!!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一道Java集合框架题 多种解题思路

    一道Java集合框架题 多种解题思路

    这篇文章主要介绍了一道Java集合框架题,多种解题思路,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • mybatis简单resultMap使用详解

    mybatis简单resultMap使用详解

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。这篇文章主要介绍了mybatis简单resultMap使用详解的相关资料,需要的朋友可以参考下
    2021-04-04
  • Hibernate框架数据分页技术实例分析

    Hibernate框架数据分页技术实例分析

    这篇文章主要介绍了Hibernate框架数据分页技术,结合实例形式分析了Hibernate框架实现数据分页的原理,步骤与相关实现技巧,需要的朋友可以参考下
    2016-03-03
  • 前后端分离跨域springBoot跨域有效解决问题

    前后端分离跨域springBoot跨域有效解决问题

    这篇文章主要介绍了前后端分离跨域springBoot跨域有效解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java的Volatile实例用法及讲解

    Java的Volatile实例用法及讲解

    在本篇文章里小编给大家整理了关于Java的Volatile知识点相关内容,有需要的朋友们可以跟着学习下。
    2019-09-09
  • MyBatis limit分页设置的实现

    MyBatis limit分页设置的实现

    这篇文章主要介绍了MyBatis limit分页设置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用SpringBoot动态切换数据源的实现方式

    使用SpringBoot动态切换数据源的实现方式

    在我们企业项目开发的过程中,有的时候,一个项目需要在运行时,根据某种条件选择使用哪个数据源,那么此时该怎么进行动态切换呢,本文给大家例举一种常见的实现方式,文中有详细的实现步骤,需要的朋友可以参考下
    2023-12-12
  • Spring Boot 如何自定义返回错误码错误信息

    Spring Boot 如何自定义返回错误码错误信息

    这篇文章主要介绍了Spring Boot 如何自定义返回错误码错误信息的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Java聊天室之使用Socket实现传递图片

    Java聊天室之使用Socket实现传递图片

    这篇文章主要为大家详细介绍了Java简易聊天室之使用Socket实现传递图片功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • Java 中的 print() 和 println()

    Java 中的 print() 和 println()

    这篇文章主要介绍了Java 中的 print() 和 println(),Java 中的 print()和println()方法用于在控制台上显示文本,下面来看看它们之间到底有什么区别吧,需要的朋友也可以参考一下
    2021-11-11

最新评论