Java两大工具库:Commons和Guava(2)

news2024/11/16 5:57:43

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!


开发中有一类应用会出现的比较多,就是文件上传,尤其是图片上传。现在一般都用云存储的方式上传图片,然后返回给前端存储地址。但是如果需要将文件或图片存储到自己的服务器上去,也可以直接使用Commons库提供的commons-fileupload工具,不用自己造轮子。

首先创建SpringBoot项目,然后添加依赖:

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.4</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

声明:版本随意,只要能正常运行就行。

然后写一个用于文件上传的Controller:

如果仅仅只是文件上传,那么整个功能就已经完成了。但是为了更友好的体验,需要直观的看到上传进度,所以需要继续加入能查看进度的接口:

在application.properties文件中加入一行属性:

file.path=/home/work/

表示文件上传后的物理存储路径。

接着创建上传进度监听器:

再自定义上传解析器:

创建解析器的配置:

用Postman测试,选择切换到Body -> 选择form-data -> key选择File类型:

再在Postman中测试进度获取接口:

测试时需要注意:

1、先调用/percent接口一次,之后再调用/upload接口。如果先调用/upload,再调用/percent,是看不到进度数据的。这是因为需要预先建立起会话,才能记录进度;而如果先上传的话,因为上传会占用整个进程,一直到上传结束,才会完成session会话的初始化;

2、最好上传大文件,方便观测效果;

3、在上传过程中,连续调用/percent接口,可以看到上传进度数据不断变化。

第一次也可以调用/upload,但直到/upload完成上传之前,调用/percent都没响应。第一次的/upload完成后,第二次调用/upload,再调用/percent就可以看到效果了

关于上传,还有两个比较重要的功能也顺带讲一下。

一是断点续传。例如迅雷的断点续传:

它的核心逻辑是:

1、传输开始时,前端/客户端会将传输文件按固定大小划分为若干个分块,每一个分块由一个线程负责完成传输过程,这些线程可以按照一定策略串行或并行执行传输,每个分块传输任务都有自己的传输状态;

2、传输之前,前端/客户端会将每个分块的校验和checksum发送给服务端保存,当某个分块传输完成后,服务端会将已传输分块的checksum与之前已保存的checksum进行比对,以判断传输是否真正完成,如果完成则更新任务传输状态为已完成;

3、如果在分块文件传输的过程中发生网络故障或系统异常需要重新传输时,服务端会给前端/客户端返回那些未完成的分块编码,前端/客户端只需要在本地将未完成的分块重新发送给服务端就行了;

4、当所有部分传输完成后,服务端依据编码排序将各个分块进行合并,最终形成一个完整的上传或下载文件;

5、分块大小必须适当,太小可能会给系统性能造成影响,太大又会使续传效果大打折扣。

实现断点续传的逻辑并不复杂,但是过程却比较麻烦,而且需要前端/客户端的紧密配合。目前比较主流的方案是前端webuploader + 后端commoms-io和commoms-fileupload,也有一些github开源的项目已经实现。

另一种是秒传。它的核心逻辑是:

1、每次上传文件时,服务器都会先做文件的MD5校验;

2、如果之前已经向服务器上传过一份文件,当再次重传这份文件,那么它的MD5肯定就和服务器上文件的MD5是一样的。

秒传的核心逻辑就是通过判断MD5是否相同来实现的,如果是同一份文件,那么MD5肯定相同,所以服务器会认为文件已上传完成,直接返回成功。反之,只要让待上传文件的MD5改变(就是对文件本身做一下修改,光改名字不行),例如文本文件,哪怕多加一个字,MD5就变了,秒传就无法实现了。

只要是实现了断点续传,那么秒传就已经等同于实现了,因为秒传只需要借助断点续传的checksum验证接口就行了。


节日期间,您仍然可以随时咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~再次祝您兔年吉祥,万事胜意!

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

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

相关文章

如何在es中查询null值

文章目录1、背景2、需求3、准备数据3.1 创建mapping3.2 插入数据4、查询 name字段为null的数据5、查询address不存在或值直接为null的数据6、参考链接1、背景 在我们向es中写入数据时&#xff0c;有些时候数据写入到es中的是null&#xff0c;或者没有写入这个字段&#xff0c;…

离散数学与组合数学-08谓词逻辑

文章目录离散数学与组合数学-08谓词逻辑8.1 谓词的引入8.1.1 引入谓词逻辑8.1.2 个体词与谓词8.2 量词的引入8.2.1 量词引入8.2.2 个体域符号化8.2.3 量词真值确定8.3 谓词符号化举例8.3.1 示例一8.3.2 示例二8.3.3 示例三8.3.4 示例四8.4 谓词合式公式8.4.1 四类符号8.4.2 项8…

MySQL运维(一)MySQL中的日志、Mysql主从复制

MySQL运维(一)MySQL中的日志、Mysql主从复制 1、MySQL日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#…

Elasticsearch 需要了解的都在这

ES选主过程&#xff1f;其实ES的选主过程其实没有很高深的算法加持&#xff0c;启动过程中对接点的ID进行排序&#xff0c;取ID最大节点作为Master节点&#xff0c;那么如果选出来的主节点中存储的元信息不是最新的怎么办&#xff1f;其实他是分了2个步骤做这件事&#xff0c;先…

react 项目 中使用 Dllplugin 打包优化技巧

目录 0.React和DLLPlugin 前言 使用步骤 结果截图 主要说明 0.React和DLLPlugin React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发&#xff0c;现在由 Facebook 和一个由个人开发者和公司组成的社区维护。React 允许开发人员构建可重用的 UI 组件并有…

“回文子串、最长回文子序列”总结,动态规划再显神通(Java实现)

目录 一、回文子串 1.1、dp定义 1.2、递推公式 1.3、初始化 1.4、遍历顺序 1.5、解题代码 二、最长回文子序列 2.1、dp定义 2.2、递推公式 2.3、初始化 2.4、遍历顺序 2.5、解题代码 一、回文子串 题目描述&#xff1a; 题目来源&#xff1a;647. 回文子串 1.1、dp定…

解决使用copy.deepcopy()拷贝Tensor或model时报错只支持用户显式创建的Tensor问题

模型训练过程中常需边训练边做validation或在训练完的模型需要做测试&#xff0c;通常的做法当然是先创建model实例然后掉用load_state_dict()装载训练出来的权重到model里再调用model.eval()把模型转为测试模式&#xff0c;这样写对于训练完专门做测试时当然是比较合适的&…

ssm学生心理健康测评网的规划与设计

摘 要 1 Abstract 1 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 JSP技术介绍 4 2.2 B/S模式 4 2.3 MySQL环境配置 5 3 系统分析 6 3.1 系统可行性分析 6 3.1.…

【模糊神经网络】基于模糊神经网络的倒立摆轨迹跟踪控制

临近春节没啥事做&#xff0c;突然想起前两年未完成的模糊神经网络&#xff0c;当时是学了一段时间&#xff0c;但是到最后矩阵求偏导那块始终不对&#xff0c;最后也不了了之了&#xff0c;趁最近有空&#xff0c;想重新回顾回顾&#xff0c;看看会不会产生新的想法。经过不断…

elasticsearch基本操作

elasticsearch基本操作基础两种模式:ik分词器词库拓展索引库操作mapping映射属性typeindexanalyzerproperties索引库的CRUD创建修改查询删除文档操作创建查询修改删除基础 本教程使用es8.6.0与kibana作为测试环境 打开开发工具 ## 1.查看节点信息 GET /_cat/nodes?v ## 2.查…

【JUC并发编程】深入浅出Java并发基石——AQS

【JUC并发编程】深入浅出Java并发基石——AQS 参考资料&#xff1a; RedSpider社区——第十一章 AQS 深入剖析并发之AQS独占锁 1.5w字&#xff0c;30图带你彻底掌握 AQS&#xff01; 深入浅出AbstractQueuedSynchronizer 我画了35张图就是为了让你深入 AQS 动画演示AQS的核心原…

遍历 “可变参数模板” 的模板参数

类模板和函数模板&#xff0c;只能包含固定数量的模板参数&#xff0c;C11支持模板参数可变&#xff0c;那么在不知道模板参数有多少个的情况下&#xff0c;如何遍历模板参数&#xff1f; 目录 一、可变参数模板的声明 二、可变参数模板的遍历 1、递归遍历 2、非递归遍历 …

idea使用DataBase连接数据库 Free MyBatis Tool自动生成 实体类工具使用

DataBase DataBase连接数据库 设置DataSources Host 》IP地址Port 》端口号User 》用户名Password 》密码Database 》连接的数据库 设置驱动 Drives tables 文件夹中即所连接数据库中表 Free MyBatis Tool自动生成 实体类&#xff0c;Mapper &#xff0c;以及mapper.xml 选…

CleanMyMac4.12.3最新版本Mac系统清理工具

CleanMyMac可以为Mac腾出空间&#xff0c;软件已经更新到CleanMyMac X 支持最新版Macos 10.14系统。CleanMyMac具有一系列巧妙的新功能&#xff0c;可让您安全&#xff0c;智能地扫描和清理整个系统&#xff0c;删除大量未使用的文件&#xff0c;减小iPhoto图库的大小&#xff…

非类型模板参数/模板的特化/模板的分离编译

上一篇文章中&#xff0c;我们对模板有了初步的认识&#xff0c;接下来我们便对模板进一步地学习&#xff01; 1.非类型模板参数 模板参数分为类型形参与非类型形参&#xff1a; ①类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类…

20 个杀手级的 JavaScript 单行代码,可以节省你的编码时间

使用这些基本的单行代码将您的 JavaScript 技能提升到一个新的水平&#xff0c;这也将节省您的编码时间 &#x1f680;1) 查找数组中的最大值&#xff1a;Math.max(...array)2&#xff09;从数组中删除重复项&#xff1a;[...newSet(array)]3&#xff09;生成一个1到100之间的随…

Java开发环境搭建实践

前言 刚刚弄完python的环境搭建&#xff0c;今年打算也要好好学习Java&#xff0c;所以把Java的环境弄起来 搭建过程 jdk下载和安装 下载 官网&#xff1a;Oracle 甲骨文中国 | 云应用和云平台 打开官网 点击产品后下拉找到Java点进去。 下载Java 我就下载最新的jdk把…

Spring Boot学习之任务学习【异步、定时、邮件】

文章目录一 异步任务1.1 创建spring Boot项目&#xff0c;选择Spring Web1.2 创建AsyncService类1.3 编写controller类1.4 在启动类上开启异步功能1.5 测试结果二 定时任务2.1 基础知识2.2 项目创建2.3 创建一个ScheduledService2.4 在主程序上增加EnableScheduling 开启定时任…

Hbuilder打包成苹果IOS-App的详解

本文相关主要记录一下使用Hbuilder打包成苹果IOS-App的详细步骤。介绍一下个人开发者账号&#xff1a;再说下什么是免费的苹果开发者账号&#xff0c;就是你没交688年费的就是免费账号&#xff0c;如果你想变成付费开发者账号&#xff0c;提交申请付费就行&#xff0c;账号都是…

【C++】priority_queue使用模拟实现

priority_queue使用 http://www.cplusplus.com/reference/queue/priority_queue/ 文档介绍 优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(大堆为例) 在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)…