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就可以了!!!

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spring Boot中,可以通过以下几种方式来存储文件: 1. 使用默认的静态资源路径:Spring Boot默认会从public、resources、static等目录下查找并返回文件资源。可以将文件直接放置在这些目录下,并通过URL路径来访问。 2. 自定义静态资源路径:除了默认的静态资源路径外,你还可以在application.properties或application.yml文件中自定义静态资源路径。例如,你可以配置一个新的文件存储目录并将其添加到静态资源路径中,以便存储和访问文件。 3. 使用MongoDB存储文件:对于较大的文件存储需求,你可以使用MongoDB的GridFS来存储文件。GridFS是MongoDB的一种机制,它可以将大型文件分块存储,并提供了方便的API来访问和管理这些文件。你可以在Spring Boot中整合MongoDB,并使用GridFS来存储和检索文件。 综上所述,在Spring Boot中,你可以根据需要选择合适的文件存储方式。如果是小文件,可以使用默认的静态资源路径或自定义静态资源路径来存储和访问文件。如果是大文件,可以考虑使用MongoDB的GridFS来存储和管理文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot实现本地文件存储预览](https://blog.csdn.net/m0_60252632/article/details/126061734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SpringBoot学习笔记(十一:使用MongoDB存储文件 )](https://blog.csdn.net/sinat_40770656/article/details/105327294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值