当前位置: 首页 > news >正文

springboot 实现本地文件存储

springboot 实现本地文件存储


1、存储介绍

  • 服务端接收上传的目的是提供文件的访问服务,对于SpringBoot而言,其对静态资源访问提供了很好的支持,使用其提供的基本默认配置可以满足开发需求,同时,又支持开发人员进行自定义配置。
    SpringBoot默认将 / 所有访问映射到以下目录:**
  • classpath:/META-INF/resources
  • classpath:/static
  • classpath:/public
  • classpath:/resources

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

2、为什么要改变存储的路径?

  • 如果都放在classpath目录下打包的文件就会很大
  • 代码与文件数据不能分开存储,就意味着文件数据的备份将变得复杂

3、解决存储问题的方法

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

一、实现过程

  • 上传文件

  • 保存文件(本地磁盘)

  • 返回文件HTTP访问服务器路径给前端,进行效果展示

  • 注:该配置有问题,在下面已解决

spring:web:resources:static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${demo.web.upload-path}
# 设置Http能访问的本地资源路径
demo:web:upload-path: D:/MineFile/zuoye/xm/equipment-management-system/qhjdata/

解释

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

二、实现代码

  • controller类(你可以写在servce类里)
    /*** 本地上传* @param file* @param request* @return*/@RequestMapping("/file")public R fileSave(MultipartFile file, HttpServletRequest request) {if (file == null) {throw new RRException("参数为空");}// 在 uploadPath 文件夹中通过日期对上传的文件归类保存// 例如:/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.pngString 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));// 添加日志输出logger.info("文件保存成功:" + folder.getPath() + File.separator + newName);// 返回上传文件的访问路径// 例如:http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.pngString filePath = request.getScheme() + "://" + request.getServerName()+ ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;return R.ok().put("filePath", filePath);} catch (IOException e) {throw new RRException("系统错误");}}

三、前端显示代码

  • 参考:spring boot 整合 minio存储 【使用篇】
  • 根据vue使用element-ui返回得到一个地址,即可访问
    在这里插入图片描述

1、遇到的问题

  • 目前已解决
    由于该项目涉及token,访问链接报错
    在这里插入图片描述
  • 但我看网络里又有token

2、解决方案

通过访问路径解决token问题

    <el-uploadclass="upload-demo"ref="upload"dragaction="#":on-change="handleChangeSelect":on-exceed="handleExceed":file-list="fileList":limit="1"multiple:auto-upload="false"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kb</div><div class="el-upload__tip" slot="tip">访问路径:<a :href="`${filePath}?token=${token}`" target="_blank">点击跳转{{ filePath }}</a>
</div></el-upload>
export default {data () {return {token: ''}}
}
创建token变量获取
this.token = this.$cookie.get('token')

3、通过在返回值里面获取token,也可以写在你需要的地方

在这里插入图片描述

4、访问路径404问题

修改yml配置文件
修改前

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

修改后

spring:resources:static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${demo.web.upload-path}
# 设置Http能访问的本地资源路径
demo:web:upload-path: D:/MineFile/zuoye/xm/equipment-management-system/qhjdata/

参考

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

相关文章:

  • SD NAND:为车载显示器注入智能与安全的心脏
  • selenium测试工具用来模拟用户浏览器的操作
  • MySQL常见面试题总结
  • Node.js基础---Express中间件
  • 利用 lxml 库的XPath()方法在网页中快速查找元素
  • kvm虚拟机修改网络模式
  • MySQL进阶之(三)InnoDB数据存储结构之数据页结构
  • SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配
  • 利用FFMPEG 将RTSP流的音频G711 转码为AAC 并 推流到RTMP
  • Git源码管理
  • docker 基础(二)
  • 民爆5G智能制造工厂数字孪生可视化平台,推进民爆工业数字化转型
  • unity初学问题:如何修改图片的坐标
  • 大数据毕业设计之前端04:管理系统为什么要自己实现图标组件
  • 抽象类与抽象方法
  • [case10]使用RSQL实现端到端的动态查询
  • [译] React v16.8: 含有Hooks的版本
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android系统模拟器绘制实现概述
  • extjs4学习之配置
  • log4j2输出到kafka
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Vim 折腾记
  • 安卓应用性能调试和优化经验分享
  • 包装类对象
  • 回顾 Swift 多平台移植进度 #2
  • 技术发展面试
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何借助 NoSQL 提高 JPA 应用性能
  • AI算硅基生命吗,为什么?
  • 数据库巡检项
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (二)springcloud实战之config配置中心
  • (力扣题库)跳跃游戏II(c++)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习日记)2024.01.09
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)我也是一只IT小小鸟
  • (转)重识new
  • ***详解账号泄露:全球约1亿用户已泄露
  • .CSS-hover 的解释
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 解决重复提交问题
  • .NET 中 GetProcess 相关方法的性能
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net各种迷惑命名解释
  • .NET连接数据库方式
  • .NET委托:一个关于C#的睡前故事
  • @Bean, @Component, @Configuration简析
  • [04]Web前端进阶—JS伪数组
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [ARM]ldr 和 adr 伪指令的区别