`
hudeyong926
  • 浏览: 2032934 次
  • 来自: 武汉
社区版块
存档分类
最新评论

PHP断点下载

    博客分类:
  • PHP
阅读更多

如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(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支持断点续传的下载远程文件的类.zip

    在PHP编程中,断点续传技术是一种非常实用的功能,特别是在处理大文件下载时,能够提高用户体验并降低服务器压力。本篇文章将详细讲解如何利用PHP实现支持断点续传的远程文件下载类,并探讨相关的核心知识点。 首先...

    php下载,支持断点,下载完成后插入记录

    该下载支持断点,往数据库插入记录时,只有下载完成时才会插入下载记录。 从网上找了好多下载资源,都是点击下载按钮或链接后就执行插入语句,该资源只有下载完成后才会执行插入操作。绝对好用,下载用的好的白忘了...

    php支持断点续传的文件下载类

    PHP下载类,支持断点续传。...HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用于响应头

    PHP实现下载断点续传的方法

    在本文中,我们将深入探讨如何使用PHP实现下载断点续传功能。断点续传是一种允许用户在因网络问题或其他原因中断下载后,从上次中断的位置继续下载的技术,提高了大文件下载的效率和用户体验。 首先,我们需要确保...

    PHP隐藏文件真实下载地址源码/支持超大文件断点续传

    非常简单完整全开源的一款关于隐藏文件真实下载地址的PHP程序源码。 1、你服务器上有什么文件供别人下载的,但是又不想显示出路径,那么此源码将是你的不二之选 2、你服务器上的文件,需要授权后,才能下载,那么,此...

    PHP大文件及断点续传下载实现代码

    以下是一个简单的PHP断点续传下载的实现思路: 1. 检测HTTP请求头中的Range字段,该字段通常包含了一个范围,例如 "bytes=500-1000",表示用户希望从第500字节开始下载到第1000字节。 2. 读取并发送文件内容,从...

    php文件下载类,支持限速,断点续传

    本知识点将深入探讨如何使用PHP实现一个文件下载类,该类支持限速、断点续传以及普通下载方式。我们将分析标题和描述中提到的特性,并提供相关的代码示例。 首先,"php文件下载类"是指一个用PHP编写的类,其主要...

    支持断点续传的下载文件的php类.zip

     }初始化-打开指定网址--重设各参数-初始化系统-获得某操作错误的原因-判别用Get方法发送的头的应答结果是否正确-看看返回的网页是否是text类型-判断返回的网页是否是特定的类型- HTTP 协议下载文件

    SWF 断点续传Java、PHP、Perl

    断点续传技术则允许用户在上传或下载大文件时,如果因为网络中断或其他原因暂停,可以在稍后从上次中断的位置继续,而无需重新开始。 描述中提到的“良好的界面”意味着设计者关注用户体验,可能涉及到UI(用户界面...

    php+html5+jquery断点续传

    本项目结合了PHP、HTML5和jQuery,实现了一个功能完善的断点续传系统。 首先,PHP作为服务器端语言,主要负责处理文件的上传和下载请求。在断点续传中,PHP需要能够识别客户端的请求,判断是否为续传操作,并根据...

    php断点续传

    再增加一个取文件大小的就行了.

    配置xdebug远程断点调试php

    配置xdebug远程断点调试php

    php+html+js+css实现文件断点续传

    这个项目是关于如何使用PHP、HTML、JavaScript(JS)和CSS来实现一个纯前端的多文件断点续传功能。下面我们将深入探讨这些技术及其在断点续传中的应用。 首先,`PHP`是服务器端脚本语言,主要负责处理文件的上传、...

    支持断点续传的PHP文件下载类

    在PHP开发中,有时我们需要提供一个能够处理大文件下载的功能,并且这个功能还必须支持断点续传。断点续传允许用户在中断下载后,从上次停止的地方继续下载,而不是重新开始,这对于大型文件或者网络不稳定的情况...

    支持断点续传的php远程文件类.zip

    分享一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请...

    curl断点续传

    断点续传原理是通过记录已下载部分的信息(通常是一个包含下载进度的文件),在下次下载时,`curl`会读取这个信息,然后从上次中断的地方开始继续下载。要实现这一功能,`curl`使用了`-C`或`--continue-at`选项,...

    php大文件断点续传.rar

    在PHP开发中,大文件上传和断点续传是一个重要的技术点,特别是在处理视频、图像等大型数据时。本文将详细解析如何利用PHP、HTML、CSS、JavaScript以及第三方插件WebUploader来实现这一功能。 首先,理解“断点续传...

    php+html5实现无刷新上传,大文件分片上传,断点续传

    为了解决这些问题,"PHP+HTML5实现无刷新上传,大文件分片上传,断点续传"的技术应运而生。这一技术通过利用HTML5的新特性,如File API和FormData对象,配合PHP后端处理,实现了高效、稳定且用户体验良好的文件上传...

    支持断点续传的php远程文件类

    一个PHP远程文件类,支持断点续传下载,代码内含有具体的调用说明。程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请下载...

    PHP断点续传,亲测可用

    这个"PHP断点续传,亲测可用"的项目就是这样的一个实例。 首先,我们来看看项目的组成部分: 1. **Huploadify.css**:这是一个CSS文件,用于定义`Huploadify`插件的样式。`Huploadify`是一个基于jQuery的文件上传...

Global site tag (gtag.js) - Google Analytics