为了阅读和开发方便,我将文件上传系列相关文章章节列出来,建议从01节开始看起,文章内容按顺序紧紧相连:

为什么会秒传

前面说了,因为服务端已经知道文件已经存在服务器端了,也就是说我们要传的这个文件,此前已经至少上传过一次了。这个文件有可能是我们自己上传的,也有可能是别人上传的。

这正是用户需要的,秒传文件,节省上传时间。对后端服务器来说,节约存储空间,同样的文件没必要存成多个文件,同时也节约带宽,当然是好事了。

那服务端是如何知道文件已经上传过了呢?

答案就是MD5。在上一节中我们知道上传前要检测文件md5值。那么本节文章我们将给您介绍如何在文件上传时将md5告诉后端,后端程序如何判断文件已经上传的?

秒传流程

1.前端计算好文件md5,并将md5赋值给文件唯一标识:file.uniqueIdentifier。

2.前端向后端发送一个get请求,携带md5值,询问后端是否该秒传文件。

3.验证md5,即后端PHP从mysql表中查询是否含有该文件md5值的文件记录,如果有,则返回秒传标识。

4.如果mysql表中没有该文件md5值记录,则按正常上传流程继续上传文件。

5.上传完成后,将该文件md5值记录到数据表中,以便下次验证md5。

准备

1.本文前端基于vue-simple-uploader上传组件,如果您还不了解该组件,请先查看本系列文章01节相关内容。

2.本文后端使用php+mysql,您需要具备相关知识。

3.在mysql数据库中建立hw_file表,表结构如下:

DROP TABLE IF EXISTS `hw_file`;

CREATE TABLE `hw_file` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`filename` varchar(255) NOT NULL COMMENT '文件名',

`filesize` int(11) NOT NULL DEFAULT '0' COMMENT '文件大小',

`md5` varchar(32) NOT NULL COMMENT '文件md5',

`type` varchar(10) NOT NULL COMMENT '文件类型',

`filepath` varchar(128) NOT NULL COMMENT '文件保存路径',

`created_at` datetime NOT NULL COMMENT '上传时间',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4;

前端发送秒传验证请求

首先,确保开启了服务端分片校验功能,这个功能在vue-simple-uploader的options选项中设置,testChunks: true, 默认是true开启状态的。

接着选中文件,准备上传前需要计算该文件的md5,关于md5的计算请查看上一节文章。

开启了分片校验功能,目的是每次在正式上传前先向后端发送个get请求,用来实现秒传、续传功能的。

在这个get请求中,在url中会携带文件的md5等相关信息一起传给后端。

在后端验证好文件md5后,会返回相应的是否秒传的标识isExist,前端要识别这个标识,并及时更新文件上传状态。

在options选项中添加函数checkChunkUploadedByResponse(),该函数响应后台返回message信息,同时检测分片信息是否上传完整,在后面的断点续传章节会讲到验证分片。

// 服务器分片校验函数

checkChunkUploadedByResponse: (chunk, message) => {

let obj = JSON.parse(message);

if (obj.isExist) {

this.statusTextMap.success = '秒传文件';

return true;

}

},

很显然,当检测到obj.isExist是true的时候,则表明文件已经存在了,这是直接将文件的上传状态改成:“秒传文件”,并结束上传。

后端验证MD5实现秒传

我们还是继续上一节的后端php文件:Uploader.php。

在获取到前端请求过来的参数中,文件唯一标志identifier就是该文件的md5值。然后根据该文件的md5值和该文件的大小filesize,这两个参数,查询hw_file表,得到满足md5和filesize都相当的记录,如果存在记录,则该文件已经上传过了。返回秒传标识:isExist = true以及文件路径。如果文件不存在,那么就开始上传文件。

//检测断点和md5

public function checkFile()

{

$identifier = $this->fileInfo['identifier'];

//检测文件md5是否已经存在

$rs = $this->checkMd5($identifier, $this->fileInfo['totalSize']);

return $rs;

}

//检测md5表是否已存在该文件

private function checkMd5($md5, $filesize)

{

$db = self::mysql();

$sql = "SELECT count(*) as t,filepath FROM `hw_file` WHERE md5=:md5 AND filesize=:filesize";

$stmt = $db->prepare($sql);

$stmt->execute([

':md5' => $md5,

':filesize' => $filesize

]);

$row = $stmt->fetch(PDO::FETCH_ASSOC);

$count = $row['t'];

if ($count > 0) {

$res['isExist'] = true;

$res['filepath'] = $row['filepath'];

} else {

$res['isExist'] = false;

}

return $res;

}

运行后,从前端选中文件上传,第一次上传成功:

第二次选择同一个文件上传,或者将文件改名再上传,或者换个浏览器换个终端上传同一个文件,都会是秒传的效果:

好了,关于秒传我们就先讲到这里,前后端的具体代码已经上传到github上了,请直接下载运行。

接下来一篇文章,我会介绍如何实现断点续传,跨终端续传文件,敬请关注。

秒传 php,文件上传之秒传文件相关推荐

  1. 文件上怎么盖章_投标文件该怎么盖章呢?投标人必看!

    大家都知道在招投标活动中,投标文件起着至关重要的作用,它是企业是否可以中标的重要因素,所以千万马虎不得,下面小编就总结了在投标文件中该怎么盖章的相关内容,大家一起看看吧! 第一部分:商务标 一.商务标 ...

  2. XShell 将Linux文件上传、下载到Windows下(rz上传、sz下载)

    安装:yum install lrzsz 1.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具,所以要在Xshell连接属性中的设置上传协议为Zmodem和接受 ...

  3. Spring Boot基础学习笔记14:实现文件上传功能

    文章目录 零.学习目标 一.文件上传概述 二.实现文件上传功能 (一)创建Spring Boot项目 (二)整合Bootstrap (三)编写文件上传页面 (四)编写项目配置文件 (五)编写文件上传控 ...

  4. javaweb 文件上传

    注意事项 我们在文件上传的时候需要知道一下几个事项. 1.为了服务器的安全,上传的文件应该放在外界不能直接访问的文件夹下,比如我们可以放在WEB-INF目录下. 2.为了防止上传文件出现覆盖 现象,上 ...

  5. Goby 漏洞更新 | 万户 OA OfficeServer.jsp 任意文件上传漏洞

    漏洞名称:万户 OA OfficeServer.jsp 任意文件上传漏洞 English Name:ezOFFICE OA OfficeServer.jsp Arbitrarily File Uplo ...

  6. android系统便签 备份,写在安卓系统手机里便笺(记事本)里的内容有什么方法能传到电脑上吗?...

    写在安卓系统手机里便笺(记事本)里的内容有什么方法能传到电脑上吗?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 写在安 ...

  7. html上传文件_.NET基于WebUploader大文件分片上传、断网续传、秒传

    (给DotNet加星标,提升.Net技能) 转自:学习中的苦与乐 cnblogs.com/xiongze520/p/10412693.html 现在的项目开发基本上都用到了上传文件功能,或图片,或文档 ...

  8. 文件上传、切片上传、秒传等

    切片上传与秒传方案 总览 理解的方案对比 一次性文件上传 切片上传 额外话题 总览 浏览器情况下: 针对大文件上传,一次性传输文件会出现网络中断等情况.不会传输成功. 把大文件切分成多个二进制流格式切 ...

  9. 大文件上传时如何做到秒传?

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  10. 大文件上传时如何做到秒传?(荣耀典藏版)

    目录 前言 一.秒传 1.什么是秒传 2.本文实现的秒传核心逻辑 二.分片上传 1.什么是分片上传 2.分片上传的场景 三.断点续传 1.什么是断点续传 2.应用场景 3.实现断点续传的核心逻辑 4. ...

最新文章

  1. webstorm2018修改运行web page端口号,并且让web在本地局域网内用IP访问
  2. 生成,保存和转换pcd点云文件
  3. python读取excel送到网页_python怎么读取excel!怎么用python将excel数据写入网页中
  4. python 去除列表空值_零基础学习Python之9大关键概念
  5. 交换机分布缓存_交换机网络嗅探方法 如何欺骗交换机缓存
  6. 复制class文件到as中出现非法字符,须要class,interface货enum
  7. 多选框勾选 和 后台数据处理
  8. C++学习笔记-异常处理
  9. python爬虫学习之XPath基本语法
  10. python项目练手(一)------飞船大战游戏
  11. 计算机硬件性能检测报告,性能测试实验报告.doc
  12. (源代码)用Python制作疫情的实时数据地图(PS:全国以及每个省)
  13. java语言的正确描述_在Java语言中,下面描述正确的是()。
  14. FTP上传和WEB上传的区别
  15. boost::bind(mynteye::imageCallback,this, _1, _2)报错error: no match for call to ‘(boost::_mfi::mf2<vo
  16. 美元指数回落美债收益率下跌,金价未能实现五连涨
  17. python中repeat_Python Pandas Series.repeat()用法及代码示例
  18. IFE阶段二学习总结
  19. Sql Server插入随机数
  20. 自语之Mysql隐式提交和事务隔离级别的关系

热门文章

  1. nba里面啥是买断合同
  2. 10代i3能用matlab吗,intel终于是有压力了,十代i3被i7灵魂附体!
  3. 【前端】从零开始读懂Web3
  4. 手把手教你Python如何抓包~【异常详细版】
  5. Python抓包并解析json爬虫
  6. GoLang之数据类型byte、rune
  7. MySQL数据库设计范式
  8. QThread 线程暂停 停止功能的实现
  9. 使能中断与禁止中断策略比较
  10. 青春禁忌游戏—兄弟连IT教育