PHP 关于文件上传下载 断点续传问题
让PHP下载代码支持断点续传 主要靠的 HTTP协议中header Content-Range来实现
先来说说 HTTP的下载原理
对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:
GET /Path/FileName HTTP/1.0
Host: www.server.com:80
Accept: **表示接收任何类型的数据。User-Agent表示用户代理,这个字段可有可无,但强烈建议加上,因为它是服务器统计、追踪以及识别客户端的依据。Connection字段中的close表示使用非持久连接。
关于HTTP协议更多的细节可以参考RFC2616(HTTP 1.1)。因为我只是想通过HTTP协议实现文件下载,所以也只看了一部分,并没有看全。
如果服务器成功收到该请求,并且没有出现任何错误,则会返回类似下面的数据:
HTTP/1.0 200 OK
Content-Length: 13057672
Content-Type: application/octet-stream
Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT
Accept-Ranges: bytes
ETag: "2f38a6cac7cec51:160c"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 16 Nov 2005 01:57:54 GMT
Connection: close
下面来解释下这些返回信息的含义
第一行是协议名称及版本号,空格后面会有一个三位数的数字,是HTTP协议的响应状态码,200表示成功,OK是对状态码的简短文字描述。状态码共有5类:
1xx属于通知类;
2xx属于成功类;
3xx属于重定向类;
4xx属于客户端错误类;
5xx属于服务端错误类。
对 于状态码,相信大家对404应该很熟悉,如果向一个服务器请求一个不存在的文件,就会得到该错误,通常浏览器也会显示类似“HTTP 404 - 未找到文件”这样的错误。Content-Length字段是一个比较重要的字段,它标明了服务器返回数据的长度,这个长度是不包含HTTP头长度的。换句话说,我们的请求中并没有Range字段(后面会说到),表示我们请求的是整个文件,所以Content-Length就是整个文件的大小。其余各字段是一些关于文件和服务器的属性信息。
以上就是通过HTTP协议实现文件下载的全过程。但还不能实现断点续传,而实际上断点续传的实现非常简单,只要在请求中加一个Range字段就可以了。
假如一个文件有1000个字节,那么其范围就是0-999,则:
Range: bytes=500- 表示读取该文件的500-999字节,共500字节。
Range: bytes=500-599 表示读取该文件的500-599字节,共100字节。
Range还有其它几种写法,但上面这两种是最常用的,对于断点续传也足矣了。如果HTTP请求中包含Range字段,那么服务器会返回206(Partial Content),同时HTTP头中也会有一个相应的Content-Range字段,类似下面的格式:
Content-Range: bytes 500-999/1000
Content-Range字段说明服务器返回了文件的某个范围及文件的总长度。这时Content-Length字段就不是整个文件的大小了,而是对应文件这个范围的字节数,这一点一定要注意。
下面来看PHP对断点续传支持的演示:
先定义一个函数 getRange() 这个函数用来处理 header中 Range 具体数据的处理
1 /** $file_size 文件大小 */ 2 function getRange($file_size){ 3 $range = isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null; 4 if(!empty($range)){ 5 $range = preg_replace('/[\s|,].*/', '', $range); 6 $range = explode('-',substr($range,6)); 7 if (count($range) < 2 ) { 8 $range[1] = $file_size; 9 } 10 $range = array_combine(array('start','end'),$range); 11 if (empty($range['start'])) { 12 $range['start'] = 0; 13 } 14 if (!isset ($range['end']) || empty($range['end'])) { 15 $range['end'] = $file_size; 16 } 17 return $range; 18 } 19 return null; 20 }
假设文件的地址为 $file_path
1 $speed = 512;//此参数为下载最大速度 2 $pos = strrpos($file_path, "/"); 3 $file_name = substr($file_path, $pos+1); 4 $file_size = filesize($file_path); 5 $ranges = getRange($file_size); 6 $fh = fopen($file_path, "rb"); 7 header('Cache-control: public'); 8 header('Content-Type: application/octet-stream'); 9 header('Content-Disposition: attachment; filename='.$file_name); 10 if ($ranges != null) { 11 header('HTTP/1.1 206 Partial Content'); 12 header('Accept-Ranges: bytes'); 13 header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start'])); 14 header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); 15 fseek($fh, sprintf('%u',$ranges['start'])); 16 }else{ 17 header("HTTP/1.1 200 OK"); 18 header(sprintf('Content-Length: %s', $file_size)); 19 } 20 while(!feof($fh)) 21 { 22 echo fread($fh, round($speed*1024, 0)); 23 ob_flush(); 24 sleep(1); 25 } 26 ($fh != null) && fclose($fh);
基本如此 就可以解决一般性文件的断点续传或者下载了
发表评论
-
Yaf框架安装指南
2018-06-29 15:44 621http://www.php.cn/php-weizij ... -
phpize是干嘛的 phpize的深入理解
2018-06-29 15:11 423安装(fastcgi模式)的时候,常常有这样一句命令:/usr ... -
php-cgi和php-fpm有什么关系
2018-06-20 16:43 520转:https://segmentfault ... -
php strip_tags 去HTML标记
2018-06-06 13:32 586只保留 p img 换行符 $c ... -
thinkphp3.2.3用redis3.0.7做session共享
2017-12-28 15:08 1029第一步:在主服务器(www服务器)和从服务器上安装red ... -
php 如何给关键词自动添加超链接
2017-02-24 13:04 738$string = "a a b b c c&qu ... -
php 去掉字符串的最后一个字符 及 截取
2016-10-26 16:48 785原字符串1,2,3,4,5,6, 去掉最后一个 ... -
php 获取月第一天和最后一天
2016-07-20 13:42 486PHP获取某一天前后任意时间 date(" ... -
PHP 过滤,替换 超链接
2014-06-09 14:19 678#过滤掉超链接 ereg_replace("&l ... -
PHP二维数组排序函数
2014-04-10 17:31 784#对二维数组进行排序,$keys就是要排序的键名, 第三参 ... -
一组PHP可逆加密解密算法
2014-04-10 17:20 664对于大部分密码加密,我们可以采用md5、sha1等方法。可以 ... -
php在linux系统下实现百度文库功能 doc或pdf转swf预览功能
2013-07-30 15:29 1502php在linux系统下实现百度文库功能 doc或pdf转s ... -
msql 只查年月日
2013-03-15 10:18 872msql 只查年月日 where TO_DA ... -
使用PHP+Sphinx建立高效的站内搜索引擎
2013-03-11 15:07 9021. 为什么要使用Sphinx 假设你现在运营 ... -
ThinkPHP模板运用指南
2012-10-18 10:44 1576使用例子: {$webTitle|md5|strtou ... -
文件夹不存在则创建
2012-10-10 16:25 0#文件夹不存在则创建 private function cr ... -
thinkPHP中CURD
2012-09-13 17:36 2435thinkPHP中CURD 一:thinkPHP中多 ... -
文件夹不存在则创建
2012-08-29 16:20 913#文件夹不存在则创建 private function cr ... -
test
2012-08-09 16:19 0DROP TABLE IF EXISTS `city`; ... -
TP 路由
2012-07-31 23:15 752/*路由定义*/ 'URL_ROUTE_RULES ...
相关推荐
为了解决这些问题,"PHP+HTML5实现无刷新上传,大文件分片上传,断点续传"的技术应运而生。这一技术通过利用HTML5的新特性,如File API和FormData对象,配合PHP后端处理,实现了高效、稳定且用户体验良好的文件上传...
2、增加断点续传功能(标题写有 断点续传,试了下和代码里也没看到相关代码,就自己研究下加入) 3、运行日志,增加几个运行步骤明细,让上传更直观到哪一步了 PS:源码下载至 ...
当下载过程中由于网络问题或其他原因中断,可以利用断点续传来继续未完成的下载,而无需重新开始。 断点续传原理是通过记录已下载部分的信息(通常是一个包含下载进度的文件),在下次下载时,`curl`会读取这个信息...
这个项目是关于如何使用PHP、HTML、JavaScript(JS)和CSS来实现一个纯前端的多文件断点续传功能。下面我们将深入探讨这些技术及其在断点续传中的应用。 首先,`PHP`是服务器端脚本语言,主要负责处理文件的上传、...
在PHP开发中,大文件上传和断点续传是一个重要的技术点,特别是在处理视频、图像等大型数据时。本文将详细解析如何利用PHP、HTML、CSS、JavaScript以及第三方插件WebUploader来实现这一功能。 首先,理解“断点续传...
使用JS实现可断点续传的文件上传方案刚开始学习前端开发就碰到文件上传问题,还要求可断点续传。查了很多资料,发现H5的file API刚好可以满足我们的需求,也遇到了一些问题,于是记录下来为有同样需求的朋友提供一些...
断点续传技术则允许用户在上传或下载大文件时,如果因为网络中断或其他原因暂停,可以在稍后从上次中断的位置继续,而无需重新开始。 描述中提到的“良好的界面”意味着设计者关注用户体验,可能涉及到UI(用户界面...
在IT领域,断点续传是一项非常实用的技术,尤其在大文件传输中,它能够提高文件上传或下载的效率,并且允许用户在中断后继续之前的过程。PHP作为一门广泛使用的服务器端脚本语言,实现断点续传的功能是完全可能的。...
断点续传是一种在网络上传输大文件时非常实用的技术,它允许用户在因网络问题中断传输后,从上次中断的地方继续传输,而不需要重新开始。本项目结合了PHP、HTML5和jQuery,实现了一个功能完善的断点续传系统。 首先...
对于开发人员来说,有了这些信息,断点续传功能将会变的和普通的文件上传功能一样简单。 相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 版权所有 2009-2012 北京新颖网络 保留所有权利 官方网站:...
WebUploader 是一个强大的前端文件上传组件,尤其适合处理大文件上传和断点续传的问题。在本文中,我们将深入探讨如何使用WebUploader实现大文件断点续传,并结合PHP服务器端进行详细阐述。 首先,断点续传是一种...
基于JavaScript+css+php支持断点续传的文件上传插件.zip jQuery文件上传插件,HTML5版uploadify,保持与uploadify一致的API,完全山寨。Uploadify官网:http://www.uploadify.com/ 在V2.0版本中,实现了文件的断点...
php实现大文件上传分片上传断点续传, 本人测试2gb有效!!! 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。 * 如何分片; * 如何...
在网页上实现文件的断点续传功能,可以让用户在上传大文件时中断或关闭页面后,再次上传时从上次停止的地方继续,而无需重新上传整个文件。这极大地提高了用户体验,尤其是在处理大文件如视频、大型软件安装包等场景...
在IT行业中,断点续传是一项非常实用的技术,尤其在大文件传输时,它能有效解决网络中断导致的传输失败问题。本教程是关于如何使用PHP和HTML5实现断点续传功能,同时支持“妙传”,即快速上传已完成部分,非常适合...
断点续传的关键在于前端能识别已上传的文件块,存储这些信息,并在需要时恢复上传。 **4. 分块上传** 为了实现断点续传,文件被分割成多个小块。每一块都有唯一的标识,这样服务器就可以识别并管理这些块。在`...
1. 支持2G文件断点续传功能。 2. 支持文件MD5验证功能。 3. 支持文件及文件夹拖拽上传功能。 4. 支持文件批量上传。 5. 支持文件夹上传。 6. 基于标准HTTP协议。 7. 免费提供JavaScript SDK包,方便您将插件...
标题中的“一款PHP的断点续传插件”指的是在PHP环境中实现的一种功能,它允许用户在上传大文件时中断并稍后继续上传,而不会丢失已上传的部分。这种技术通常用于提高网络传输的可靠性和用户体验,特别是对于网络条件...
所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。 不使用断点续传 get /down.zip ...
断点续传是大文件上传的一种优化策略,尤其在网络不稳定或上传过程可能中断的情况下,它允许用户暂停并从上次中断的地方继续上传,极大地提高了用户体验。 文件断点续传的核心在于将大文件切分为多个小片段,然后...