如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(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下载类,支持断点续传。...HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用于响应头
在本文中,我们将深入探讨如何使用PHP实现下载断点续传功能。断点续传是一种允许用户在因网络问题或其他原因中断下载后,从上次中断的位置继续下载的技术,提高了大文件下载的效率和用户体验。 首先,我们需要确保...
非常简单完整全开源的一款关于隐藏文件真实下载地址的PHP程序源码。 1、你服务器上有什么文件供别人下载的,但是又不想显示出路径,那么此源码将是你的不二之选 2、你服务器上的文件,需要授权后,才能下载,那么,此...
以下是一个简单的PHP断点续传下载的实现思路: 1. 检测HTTP请求头中的Range字段,该字段通常包含了一个范围,例如 "bytes=500-1000",表示用户希望从第500字节开始下载到第1000字节。 2. 读取并发送文件内容,从...
本知识点将深入探讨如何使用PHP实现一个文件下载类,该类支持限速、断点续传以及普通下载方式。我们将分析标题和描述中提到的特性,并提供相关的代码示例。 首先,"php文件下载类"是指一个用PHP编写的类,其主要...
}初始化-打开指定网址--重设各参数-初始化系统-获得某操作错误的原因-判别用Get方法发送的头的应答结果是否正确-看看返回的网页是否是text类型-判断返回的网页是否是特定的类型- HTTP 协议下载文件
断点续传技术则允许用户在上传或下载大文件时,如果因为网络中断或其他原因暂停,可以在稍后从上次中断的位置继续,而无需重新开始。 描述中提到的“良好的界面”意味着设计者关注用户体验,可能涉及到UI(用户界面...
本项目结合了PHP、HTML5和jQuery,实现了一个功能完善的断点续传系统。 首先,PHP作为服务器端语言,主要负责处理文件的上传和下载请求。在断点续传中,PHP需要能够识别客户端的请求,判断是否为续传操作,并根据...
再增加一个取文件大小的就行了.
配置xdebug远程断点调试php
这个项目是关于如何使用PHP、HTML、JavaScript(JS)和CSS来实现一个纯前端的多文件断点续传功能。下面我们将深入探讨这些技术及其在断点续传中的应用。 首先,`PHP`是服务器端脚本语言,主要负责处理文件的上传、...
在PHP开发中,有时我们需要提供一个能够处理大文件下载的功能,并且这个功能还必须支持断点续传。断点续传允许用户在中断下载后,从上次停止的地方继续下载,而不是重新开始,这对于大型文件或者网络不稳定的情况...
分享一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请...
断点续传原理是通过记录已下载部分的信息(通常是一个包含下载进度的文件),在下次下载时,`curl`会读取这个信息,然后从上次中断的地方开始继续下载。要实现这一功能,`curl`使用了`-C`或`--continue-at`选项,...
在PHP开发中,大文件上传和断点续传是一个重要的技术点,特别是在处理视频、图像等大型数据时。本文将详细解析如何利用PHP、HTML、CSS、JavaScript以及第三方插件WebUploader来实现这一功能。 首先,理解“断点续传...
为了解决这些问题,"PHP+HTML5实现无刷新上传,大文件分片上传,断点续传"的技术应运而生。这一技术通过利用HTML5的新特性,如File API和FormData对象,配合PHP后端处理,实现了高效、稳定且用户体验良好的文件上传...
一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请下载...
这个"PHP断点续传,亲测可用"的项目就是这样的一个实例。 首先,我们来看看项目的组成部分: 1. **Huploadify.css**:这是一个CSS文件,用于定义`Huploadify`插件的样式。`Huploadify`是一个基于jQuery的文件上传...