如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(Resumable Download),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继续下载,而不必重新下载整个文件。通常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现。
<?php /** * php下载类,支持断点续传 * * Func: * download: 下载文件 * setSpeed: 设置下载速度 * getRange: 获取header中Range */ class FileDownload { private $_speed = 512; // 下载速度 /** * 下载 * * @param String $file 要下载的文件路径 * @param String $name 文件名称,为空则与下载的文件名称一样 * @param boolean $reload 是否开启断点续传 */ public function download($file, $name = '', $reload = false) { if (file_exists($file)) { if ($name == '') { $name = basename($file); } $fp = fopen($file, 'rb'); $file_size = filesize($file); $ranges = $this->getRange($file_size); header('cache-control:public'); header('content-type:application/octet-stream'); header('content-disposition:attachment; filename='.$name); if ($reload && $ranges != null) { // 使用续传 header('HTTP/1.1 206 Partial Content'); header('Accept-Ranges:bytes'); // 剩余长度 header(sprintf('content-length:%u', $ranges['end'] - $ranges['start'])); // range信息 header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); // fp指针跳到断点位置 fseek($fp, sprintf('%u', $ranges['start'])); } else { header('HTTP/1.1 200 OK'); header('content-length:'.$file_size); } while (!feof($fp)) { echo fread($fp, round($this->_speed * 1024, 0)); ob_flush(); sleep(1); // 用于测试,减慢下载速度 } ($fp != null) && fclose($fp); } else { return ''; } } /** * 设置下载速度 * * @param int $speed */ public function setSpeed($speed) { if (is_numeric($speed) && $speed > 16 && $speed < 4096) { $this->_speed = $speed; } } /** * 获取header range信息 * * @param int $file_size 文件大小 * @return Array */ private function getRange($file_size) { if (isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])) { $range = $_SERVER['HTTP_RANGE']; $range = preg_replace('/[\s|,].*/', '', $range); $range = explode('-', substr($range, 6)); if (count($range) < 2) { $range['1'] = $file_size; } $range = array_combine(array( 'start', 'end' ), $range); if (empty($range['start'])) { $range['start'] = 0; } if (empty($range['end'])) { $range['end'] = $file_size; } return $range; } return null; } } $file = 'book.zip'; $name = time().'.zip'; $obj = new FileDownload(); $flag = $obj->download($file, $name); //$flag = $obj->download($file, $name, true); // 断点续传 if (!$flag) { echo 'file not exists'; } ?>
相关推荐
本文实例讲述了PHP实现下载断点续传的方法。分享给大家供大家参考。 具体实现代码如下: 复制代码 代码如下:<?php /* * PHP下载断点续传 */ function dl_file_resume($file){ //检测文件是否存在 ...
该下载支持断点,往数据库插入记录时,只有下载完成时才会插入下载记录。 从网上找了好多下载资源,都是点击下载按钮或链接后就执行插入语句,该资源只有下载完成后才会执行插入操作。绝对好用,下载用的好的白忘了...
PHP下载类,支持断点续传。...HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用于响应头
非常简单完整全开源的一款关于隐藏文件真实下载地址的PHP程序源码。 1、你服务器上有什么文件供别人下载的,但是又不想显示出路径,那么此源码将是你的不二之选 2、你服务器上的文件,需要授权后,才能下载,那么,此...
介绍一个php支持断点续传的下载远程文件的类,打开指定网址,获得某操作错误的原因,判别用Get方法发送的头的应答结果是否正确,判断返回的网页是否是特定的类型等。
}初始化-打开指定网址--重设各参数-初始化系统-获得某操作错误的原因-判别用Get方法发送的头的应答结果是否正确-看看返回的网页是否是text类型-判断返回的网页是否是特定的类型- HTTP 协议下载文件
再增加一个取文件大小的就行了.
配置xdebug远程断点调试php
一个用php写的文件下载类,可支持限速,断点续传及普通下载方式,有示例程序,使用很方便
一般来说浏览器要同时下载几个文件,比如pdf文件,会在服务器端把几个文件压缩成一个文件。但是导致的问题就是会消耗服务器的cpu和io资源。 那有没有办法,用户点了几个文件,在客户端同时下载呢? 支持html5的...
分享一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请...
php5.6 下用zenddebugger单步断点调试代码2php5.6 下用zenddebugger单步断点调试代码2
一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请下载...
php+html5+jquery断点续传,本人已经测试成功,欢迎大家一起研究。
php下载类,支持断点续传。...HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用于响应头
curl断点续传,下载exe完成打开exe
良好的界面 可以自定义 多种触发事件 支持断点续传
php+html5实现无刷新上传,大文件分片上传,断点续传具体案例完整代码 详情:https://blog.csdn.net/qq43599939/article/details/79762042
2、增加断点续传功能(标题写有 断点续传,试了下和代码里也没看到相关代码,就自己研究下加入) 3、运行日志,增加几个运行步骤明细,让上传更直观到哪一步了 PS:源码下载至 ...
纯js实现多文件断点续传功能,便于开发者前端更换自己喜欢的UI设计。