springboot 实现本地文件存储

springboot 实现本地文件存储


实现过程

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

存储

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

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

问题

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

解决方法

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}
# 设置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访问服务
    /*** 本地上传* @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存储 【使用篇】
返回得到一个地址,即可访问
在这里插入图片描述

问题

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

已解决

通过访问路径解决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>
创建token变量获取
this.token = this.$cookie.get('token')

访问路径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实现本地文件存储及预览

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H3C防火墙安全授权导入

一、防火墙授权概述 前面我们已经了解了一些防火墙的基本概念&#xff0c;有讲过防火墙除了一些基本功能&#xff0c;还有一些高级安全防护&#xff0c;但是这些功能需要另外独立授权&#xff0c;不影响基本使用。这里以H3C防火墙为例进行大概了解下。 正常情况下&#xff0c;防…

深度学习_15_过拟合欠拟合

过拟合和欠拟合 过拟合和欠拟合是训练模型中常会发生的事&#xff0c;如所要识别手势过于复杂&#xff0c;如五角星手势&#xff0c;那就需要更改高级更复杂的模型去训练&#xff0c;若用比较简单模型去训练&#xff0c;就会导致模型未能抓住手势的全部特征&#xff0c;那简单…

[云原生] K8s之pod进阶

一、pod的状态说明 &#xff08;1&#xff09;Pod 一直处于Pending状态 Pending状态意味着Pod的YAML文件已经提交给Kubernetes&#xff0c;API对象已经被创建并保存在Etcd当中。但是&#xff0c;这个Pod里有些容器因为某种原因而不能被顺利创建。比如&#xff0c;调度不成功(…

原神抢码,米游社抢码-首发

本文章仅供学习使用-侵权请联系删除_2023年3月14日08:17:06 本来在深渊12层打不过的我偶然在刷到了一个dy的直播间&#xff0c;看到主播在抢码上号帮忙打深渊还号称痛苦号打不满不送原石的旗号我就决定扫码试试&#xff0c;在直播间内使用了两部手机互相扫码在扫了一下午的码后…

自动驾驶技术详解

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;自动驾驶技术 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 一 自动驾驶视觉感知算法 1目标检测 1.1 两阶…

代码随想录算法训练营第四五天 | dp[j] = min(dp[j], dp[j - coins[i]] + 1)

目录 爬楼梯 &#xff08;进阶&#xff09;零钱兑换完全平方数总结 LeetCode 70. 爬楼梯 &#xff08;进阶&#xff09; LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 爬楼梯 &#xff08;进阶&#xff09; 好做 import java.util.*;public class Main{// dp[i] 爬到有…

css背景图片属性

基础代码&#xff1a; div {width: 200px;height: 200px;background: url(./css-logo.png); }<div></div> 1、background-repeat&#xff1a;默认是repeat 设置背景图片在容器内是否平铺。 background-repeat: repeat-y; background-repeat: repeat-x; background…

消息中间件之RocketMQ源码分析(二十四)

事务消息 事务消息机制。 事务消息的发送和处理总结为四个过程: 1.生产者发送事务消息和执行本地事务 2.Broker存储事务消息 3.Broker回查事务消息 4.Broker提交或回滚事务消息 生产者发送事务消息和执行本地事务。 发送过程分为两个阶段: 第一阶段,发送事务消息 第二阶段,发…

Spring Expression Language (SpEL)

Spring 表达语言&#xff08;SpEL&#xff09;&#xff0c;支持在运行时查询和操作对象图&#xff0c;可以用于数据绑定、属性访问、方法调用等。使用SpEL可以简化代码并提高应用程序的可维护性。 1 概览 SpelExpressionParser是SpEL的一个核心组件&#xff0c;负责解析和编译…

CentOS安装编译Python3.11.6

CentOs自带python2版本太低&#xff0c;项目需要python3&#xff0c;于是自己安装python 操作指南&#xff1a; 重新下载源代码&#xff1a; # 删除旧的 Python 源代码文件&#xff08;如果有&#xff09; rm -rf Python-3.11.6.tar.xz # 下载 Python 3.11.6 的源代码文件 wget…

Java泛型简介

Java泛型简介 Java泛型是在Java 5中引入的一个特性&#xff0c;它允许程序员在编译时指定类、接口或方法能够接受的类型。泛型的主要目的是提供编译时类型安全检查&#xff0c;避免在运行时因为类型转换错误而导致的ClassCastException。 在没有泛型之前&#xff0c;Java中的集…

如何利用动态静态代理IP实现跨地域网络营销与市场研究

动态代理IP和静态代理IP都可以在跨地域网络营销与市场研究中发挥关键作用&#xff0c;具体实现方式如下&#xff1a; ### 动态代理IP的应用&#xff1a; 1. 跨地域营销活动测试&#xff1a; - 在进行网络营销时&#xff0c;尤其是要验证广告投放、SEO效果或A/B测试不同地区用户…

Ubuntu系统使用Docker搭建Jupyter Notebook并实现无公网ip远程连接

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

C语言系列(所需基础:大学C语言及格)-4-转义字符/注释/选择语句

文章目录 一、转义字符二、注释三、选择语句 一、转义字符 加上\会讲原来的字符改变意思&#xff0c;即进行转义 例如\t会使t变成\t用于表示转义字符&#xff0c;使得t转义成水平制表符 其他转义字符&#xff1a; 三字母词&#xff08;展示\&#xff1f;的用处&#xff09;…

C#面:接口是一种引用类型,不可以声明公有的域或私有的成员变量,但是可以声明什么呢?

可以声明&#xff1a;方法&#xff0c;属性&#xff0c;索引器&#xff0c;事件。 接口的主要作用是定义一套规范&#xff0c;使得不同的类可以按照相同的规范进行交互。通过实现接口&#xff0c;类可以具备多态性&#xff0c;即可以以接口类型来引用对象&#xff0c;并调用接…

k8s-001-Centos7内核升级

1. 查看内核 [rootlocalhost ~]# uname -a 2. 执行的命令(安装最新版内核): 下载: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安装: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm &#xff08; 查看最新版内核&…

杭州默安-安全技术实习生-一面

1.自我介绍 略 2.专业主修的课程 略 3.xss漏洞的类型&#xff0c;原理及防御 原理&#xff0c;服务器对用户的输入过滤不严格&#xff0c;将用户的输入当作Javascript代码执行并返回给客户端。 防御&#xff0c;输入和url参数过滤&#xff0c;HTML实体编码转义特殊字符。…

力扣hot100题解(python版33-35题)

33、排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&a…

kafka架构详解

文章目录 概述kafaka架构Kafka的设计时什么样的Zookeeper 在 Kafka 中的作用知道 概述 Apache Kafka 是分布式发布 - 订阅消息系统&#xff0c;在 kafka 官网上对 kafka 的定义&#xff1a;一个分布式发布 - 订阅消息传递系统。 Kafka 最初由 LinkedIn 公司开发&#xff0c;Li…

mysql 中 auto_increment 自增约束的用法和配置

自增约束 int字段 特殊约束条件&#xff0c;用于为表中写入新的记录生成唯一的值&#xff0c;一个表中只能有一个自增约束字段 格式 字段 数据类型 auto_increment 创建带有自增约束的表 create table student_game_auto ( id int unique auto_increment, name char(5),…