四、文件上传系列-计算文件MD5值

根据业务需要,在上传文件前我们要读取文件的md5值,将md5值传给后端用作秒传和断点续传文件的唯一标识。那么前端就需要使用js获取文件的md5值,对于普通小文件可以很轻松的读取文件md5值,而超大文件的md5值是如何快速的获取到的呢?

超大文件如何计算md5值?

前面的文章我们了解了分片上传,解决了大文件和超大文件web上传的超时的问题。

这里我们说的超大文件一般值1G+的文件,对于超大文件,我们不应该一次性的读取文件,这样的话有可能浏览器直接爆了。我们借助分片上传的概念,一片一片的读取文件,即每次读取一个分片内容chunk,之后再进行下一个分片内容继续计算,也就是读一片算一片,这样文件读取完毕,md5的值也就计算好了,同时整个计算过程占有内存也比一次性读取文件要低低多。

使用spark-md5计算本地文件md5

spark-md5.js号称是最适合前端最快的算法,能快速计算文件的md5。

快速安装:

npm install --save spark-md5

在组件中使用spark-md5时先引入:

import SparkMD5 from 'spark-md5';

spark-md5提供了两个计算md5的方法。一种是用SparkMD5.hashBinary() 直接将整个文件的二进制码传入,直接返回文件的md5。这种方法对于小文件会比较有优势——简单而且速度超快。

另一种方法是利用js中File对象的slice()方法(File.prototype.slice)将文件分片后逐个传入spark.appendBinary()方法来计算、最后通过spark.end()方法输出md5。很显然,此方法就是我们前面讲到的分片计算md5。这种方法对于大文件和超大文件会非常有利,不容易出错,不占用大内存,并且能够提供计算的进度信息。

以上两种方法在spark-md5.js项目主页都有实例代码,本文主要讲第二种方法,即对超大文件计算的md5值。

vue-simple-uploader中添加“计算md5”状态

在上传文件前,需要检查文件状态,计算文件md5值。在上传列表中,其实是暂停状态,而我们不希望用户看到是暂停状态,我们应该友好的告诉用户正在计算md5,或者正在预处理文件,准备上传的状态。

从前几篇文章中,我们已经了解vue-simple-uploader在上传时会返回几种状态,如:上传中…、暂停、上传成功等状态。但并没有对自定义状态提供很好的接口。人们想法设法将类似计算md5的状态显示在上传列表中,在github上也跟作者提过,但好像没有得到更好的解决,无奈我翻看了一下作者的源码,fork下来,稍微做了几处改动,得到以下效果:

并且对原列表样式和图标做了修改,如果你已经安装好了vue-simple-uploader,直接下载:https://github.com/lrfbeyond/vue-uploader/blob/master/dist/vue-uploader.js,替换你的项目下\node_modules\vue-simple-uploader\dist\vue-uploader.js,然后再重新npm run dev即可。

我们在组件调用时可以定义状态,其中cmd5表示的是正在计算md5。

statusTextMap: {success: '上传成功',error: '上传出错了',uploading: '上传中...',paused: '暂停',waiting: '等待中...',cmd5: '计算md5...'
},fileStatusText: (status, response) => {return this.statusTextMap[status];
},

计算文件md5

在选择文件准备上传时,触发onFileAdded(),先暂停上传,把md5计算出来后再上传。

暂停上传需要在uploader组件中设置:autoStart="false"即可。

methods: {onFileAdded(file) {// 计算MD5this.computeMD5(file);},computeMD5(file) {...}
}

根据spark-md5.js官方的例子,我们设置分片计算,每个分片2MB,根据文件大小可以计算得出分片总数。

然后设置文件状态为计算md5,即file.cmd5 = true;

接着一片片的一次读取分片信息,最后由spark.end()计算得出文件的md5值。

得到md5值后,我们要将此文件的md5值赋值给file.uniqueIdentifier = md5;,目的是为了后续的秒传和断点续传作为文件的唯一标识传给后端。

最后取消计算md5状态,即file.cmd5 = false;,并且立马开始上传文件:file.resume();

//计算MD5
computeMD5(file) {let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,chunkSize = 2097152, //2MBchunks = Math.ceil(file.size / chunkSize),currentChunk = 0,spark = new SparkMD5.ArrayBuffer(),fileReader = new FileReader();let time = new Date().getTime();file.cmd5 = true; //文件状态为“计算md5...”fileReader.onload = (e) => {spark.append(e.target.result);   // Append array buffercurrentChunk++;if (currentChunk < chunks) {console.log(`第${currentChunk}分片解析完成, 开始第${currentChunk +1} / ${chunks}分片解析`);loadNext();} else {console.log('finished loading');let md5 = spark.end(); //得到md5console.log(`MD5计算完成:${file.name} \nMD5:${md5} \n分片:${chunks} 大小:${file.size} 用时:${new Date().getTime() - time} ms`);spark.destroy(); //释放缓存file.uniqueIdentifier = md5; //将文件md5赋值给文件唯一标识file.cmd5 = false; //取消计算md5状态file.resume(); //开始上传}};fileReader.onerror = () => {console.warn('oops, something went wrong.');file.cancel();};let loadNext = () => {let start = currentChunk * chunkSize,end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end));};loadNext();
},

选择文件后,先计算文件md5值:

我们看到1个约83MB的文件,计算md5用时1.3秒。

而继续测试发现,1个约2GB的大文件,用时约29秒,我的电脑上8G内存,这个计算文件md5的速度是相当给力的了。

源码已经提交到github上了,请前往下载:https://github.com/lrfbeyond/fast-uploader

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

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

相关文章

大华智慧园区综合管理平台SQL注入漏洞

大华智慧园区综合管理平台SQL注入漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现PoC查询当前用户小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者…

ApiPost的使用

1. 设计接口 请求参数的介绍 Query:相当于get请求&#xff0c;写的参数在地址栏中可以看到 Body: 相当于 post请求&#xff0c;请求参数不在地址栏中显示。 请求表单类型&#xff0c;用form-data json文件类型&#xff0c;用row 2. 预期响应期望 设置完每一项点一下生成响应…

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

Chrome浏览器各版本对应的驱动

目录 1、Chrome浏览器各版本&#xff08;低版本&#xff09;对应的驱动2、其他版本&#xff08;高版本&#xff09;直接在对应的目录下下载即可3、下载地址 1、Chrome浏览器各版本&#xff08;低版本&#xff09;对应的驱动 chromedriver版本支持的Chrome版本v2.41v67-69v2.40v…

使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功 1. Linux(centos8…

FFmpeg常见命令行(五):FFmpeg滤镜使用

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

Labview控制APx(Audio Precision)进行测试测量(五)

驱动程序 VIs如何处理配置设置中的单元 APx500 应用程序具有复杂的控件&#xff0c;具有以下功能: 数值和单位组合在一个控制中(例如&#xff0c;1.000 Vrms ) •值转换为 SI 格式(例如&#xff0c;1.000 mVrms 或 1.000 μVrms) •单位之间的转换发生在控制(例如&#xff0c;V…

警惕!部分iPhone 6S无法开机,Apple已推出了维修计划

苹果已经发布了一项新维修计划的通知&#xff0c;以解决导致某些iPhone 6S和6S Plus手机无法开机的问题。该程序页面说&#xff1a;“苹果公司确定某些iPhone 6s和iPhone 6s Plus设备可能由于组件故障而无法开机。”该程序俗称“ iPhone 6s和iPhone 6s Plus服务程序&#xff0c…

苹果待处理订单要多久_用苹果 iPhone 时操作失误被扣费,该如何申请退款?

不知道大家是否遇到过这种情况: 在 iPhone 上使用某些应用时,显示需要付费,自己本身是拒绝的,结果一不小心点错了,出现误操作导致出现了扣费的问题。 咳咳,肯定不止我一个人遇到过,这时候很多人就慌了,有的赶紧联系客服,有的就觉得几块钱的事,算了。 其实这种误操作导…

iphone手机计算机彩蛋,神奇彩蛋!iPhone 6可用容量从537MB秒变3.3GB

16GB版&#xff0c;也叫乞丐版iPhone用户有个共同的秘密&#xff1a;每隔一段时间就要想办法清理手机存储空间&#xff0c;删掉那些不常用的app。实在删不动的时候&#xff0c;难免后悔没多花几百块钱买64GB的。乐观派则会安慰自己&#xff0c;常常清理手机有助于养成“断舍离”…

苹果app退款_苹果App Store应用,5月最新退款

作为一个iOS设备用户&#xff0c;在AppStore上买点东西那是难免的&#xff0c;比如看到什么好玩的游戏或好用的APP&#xff0c;只要不是贵的离谱&#xff0c;相比不少人都不会吝啬这点钱&#xff0c;但人总有看走眼的时候&#xff0c;一旦不小心买错APP该如何申请退款呢&#x…

文字生成图片:输入描述语,人工智能自动帮你绘图!

Disco Diffusion 是发布于 Google Colab 平台的一款利用人工智能深度学习进行数字艺术创作的工具&#xff0c;它是基于 MIT 许可协议的开源工具&#xff0c;可以在 Google Drive 直接运行&#xff0c;也可以部署到本地运行&#xff0c;目前最新的版本是 Disco Diffusion v5.2。…

Python人工智能之图片识别,Python3一行代码实现图片文字识别

自学Python3第5天&#xff0c;今天突发奇想&#xff0c;想用Python识别图片里的文字。没想到Python实现图片文字识别这么简单&#xff0c;只需要一行代码就能搞定 #作者微信&#xff1a;2501902696 from PIL import Image import pytesseract #上面都是导包&#xff0c;只需要…

人工智能识别图片食物

一、准备食物图片&#xff08;橘子和苹果&#xff09; 二、识别学习关键代码编写 public static void study() throws Exception {//学习 Picture picture new Picture();//图片解析类 图片&#xff08;文件&#xff09;-三通道矩阵 Config config new Config();//现有的环境…

【论文阅读】基于深度学习的时序预测——Crossformer

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文三&#xff1a;2022 FEDformer&#xff1a;长序列数据预测 论文四&#xff1a;2022 Non-Stationary Transformers&#xff1a;非平…

人工智能图片分类Python小程序

个人小作业&#xff0c;虽说做的很差&#xff0c;也算是一个学习的转化&#xff1b;主要用于分类自己下载的壁纸 1 背景 学期末需要一个学习成果的展示&#xff0c;高难度的自己做不来&#xff0c;模型也跑不动&#xff08;电脑有点渣&#xff09;&#xff0c;刚好自己也有图…

人工智能最全图谱

在过去的几个月中&#xff0c;我一直在收集有关人工智能的相关资料。随着各种的问题被越来越频繁的提及&#xff0c;我决定整理并分享有关人工智能、神经网络、机器学习、深度学习与大数据的技术合辑。同时为了内容更加生动易懂&#xff0c;本文将会针对各个大类展开详细解析。…

人工智能AI - 以图搜图产品

网站首页 以图搜图产品 主要特性 底层使用特征向量相似度搜索单台服务器十亿级数据的毫秒级搜索近实时搜索&#xff0c;支持分布式部署随时对数据进行插入、删除、搜索、更新等操作支持在线用户管理与服务器性能监控&#xff0c;支持限制单用户登录 系统功能 搜索管理&#…

2021-05-19 人工智能图片识别

手写数字识别案例&#xff08;第一版&#xff09; 任务&#xff1a;输入&#xff1a;28*28的灰度图片 输出&#xff1a;0-9的数字标签 样本量&#xff1a;6万训练样本&#xff0c;1万测试样本 数据处理&#xff1a;读取数据和预处理操作 模型设计&#xff1a;网络结构 训练…

人工智能——图搜索

一&#xff0e;数据驱动和目标驱动搜索 以下情况建议使用目标驱动搜索&#xff1a; &#xff08;1&#xff09;目标或假设是在问题陈述中给出的。例如定理的证明&#xff0c;目标就是定理。 &#xff08;2&#xff09;与问题数据匹配的规则非常多&#xff0c;会产生大量分支…