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

本文实例讲述了PHP实现下载断点续传的方法。分享给大家供大家参考。

具体实现代码如下:

代码如下:

<?php
/*
 * PHP下载断点续传
 */
function dl_file_resume($file){
 
    //检测文件是否存在
    if (!is_file($file)) { die("<b>404 File not found!</b>"); }
     
    $len = filesize($file);//获取文件大小
    $filename = basename($file);//获取文件名字
    $file_extension = strtolower(substr(strrchr($filename,"."),1));//获取文件扩展名
     
    //根据扩展名 指出输出浏览器格式
    switch( $file_extension ) {
        case "exe": $ctype="application/octet-stream"; break;
        case "zip": $ctype="application/zip"; break;
        case "mp3": $ctype="audio/mpeg"; break;
        case "mpg":$ctype="video/mpeg"; break;
        case "avi": $ctype="video/x-msvideo"; break;
        default: $ctype="application/force-download";
    }
     
    //Begin writing headers
    header("Cache-Control:");
    header("Cache-Control: public");
     
    //设置输出浏览器格式
    header("Content-Type: $ctype");
    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {//如果是IE浏览器
        # workaround for IE filename bug with multiple periods / multiple dots in filename
        # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
        $iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1);
        header("Content-Disposition: attachment; filename=\"$iefilename\"");
    } else {
        header("Content-Disposition: attachment; filename=\"$filename\"");
    }
    header("Accept-Ranges: bytes");
     
    $size=filesize($file);
    //如果有$_SERVER['HTTP_RANGE']参数
    if(isset($_SERVER['HTTP_RANGE'])) {
/*   ---------------------------
   Range头域   Range头域可以请求实体的一个或者多个子范围。例如,   表示头500个字节:bytes=0-499   表示第二个500字节:bytes=500-999   表示最后500个字节:bytes=-500   表示500字节以后的范围:bytes=500-   第一个和最后一个字节:bytes=0-0,-1   同时指定几个范围:bytes=500-600,601-999   但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。
   ---------------------------*/
   
// 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912-
   
        list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
   //if yes, download missing part
        str_replace($range, "-", $range);//这句干什么的呢。。。。
   $size2=$size-1;//文件总字节数
        $new_length=$size2-$range;//获取下次下载的长度
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");//输入总长
        header("Content-Range: bytes $range$size2/$size");//Content-Range: bytes 4908618-4988927/4988928   95%的时候
    } else {//第一次连接
        $size2=$size-1;
        header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928
        header("Content-Length: ".$size);//输出总长
    }
    //打开文件
    $fp=fopen("$file","rb");
    //设置指针位置
    fseek($fp,$range);
    //虚幻输出
    while(!feof($fp)){
        //设置文件最长执行时间
        set_time_limit(0);
        print(fread($fp,1024*8));//输出文件
        flush();//输出缓冲
        ob_flush();
    }
    fclose($fp);
    exit;
}
 
dl_file_resume("1.zip");//同级目录的1.zip 文件
 
//---------------------------------------
 
//不支持断点续传的文件下载。
 
//---------------------------------------
 
downFile("1.zip");
 
function downFile($sFilePath)
{
   if(file_exists($sFilePath)){
       $aFilePath=explode("/",str_replace("\\","/",$sFilePath),$sFilePath);
       $sFileName=$aFilePath[count($aFilePath)-1];
       $nFileSize=filesize ($sFilePath);
       header ("Content-Disposition: attachment; filename=" . $sFileName);
       header ("Content-Length: " . $nFileSize);
       header ("Content-type: application/octet-stream");
       readfile($sFilePath);
   }
   else
   {
       echo("文件不存在!");
   }
}
?>

希望本文所述对大家的PHP程序设计有所帮助。

(0)

相关推荐

  • php断点续传之文件分割合并详解

    php实现断点续传,就需要把大文件分割成多个小文件,然后单个上传.传完后在合并. │ merge.php –合并文件脚本 │ merge.zip –合并后文件 │ socket.zip –需要分割的文件 │ split.php –分割文件脚本 │ └─split –分割后小文件目录 下面是源码 split.php <?php $fp = fopen("socket.zip", "rb"); $filesize = 10; $i = 0; $no = 1; wh

  • PHP搭建大文件切割分块上传功能示例

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现意外的情况.  但是在有些业务场景中,大文件上传又是必须的,比如邮箱附件,或者内部OA等等. 问题 服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_max_filesize = 2M //PHP最大能接受的文件大小 post_max_size = 8M //PHP能收到的最大P

  • PHP实现HTTP断点续传的方法

    本文实例讲述了PHP实现HTTP断点续传的方法.分享给大家供大家参考.具体实现方法如下: <?php /** * PHP-HTTP断点续传实现 * @param string $path: 文件所在路径 * @param string $file: 文件名 * @return void */ function download($path,$file) { $real = $path.'/'.$file; if(!file_exists($real)) { return false; } $si

  • 前端实现文件的断点续传(前端文件提交+后端PHP文件接收)

    早就听说过断点续传这种东西,前端也可以实现一下.断点续传在前端的实现主要依赖着HTML5的新特性,所以一般来说在老旧浏览器上支持度是不高的. 本文通过断点续传的简单例子(前端文件提交+后端PHP文件接收),理解其大致的实现过程 还是先以图片为例,看看最后的样子 一.一些知识准备 断点续传,既然有断,那就应该有文件分割的过程,一段一段的传. 以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串.数组的分割,我们可以可以使用slice方法来分割文件. 所以断点续传的最基本实现也就是:前端通

  • PHP使用range协议实现输出文件断点续传代码实例

    range协议用途:一般是用在断点续传的时候,但是实际的用户很大,例如你的web server需要输出一个大文件,那么用range可以分段输出,缓解压力.同时在提供音乐视频等服务时可以缓冲下载,如果用户中途关闭,可以节约网络带宽. <?php // 文件名 $filename = $_GET ['filename']; // 文件路径 $location = 'media/' . $filename; // 后缀 $extension = substr ( strrchr ( $filename

  • php支持断点续传、分块下载的类

    本文是为大家分享php支持断点续传.分块下载的类,供大家参考,具体内容如下 <?php /** * User: djunny * Date: 2016-04-29 * Time: 17:18 * Mail: 199962760@qq.com * 支持断点下载的类 */ class downloader { /** * download file to local path * * @param $url * @param $save_file * @param int $speed * @par

  • PHP实现文件下载断点续传详解

    如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(Resumable Download),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继续下载,而不必重新下载整个文件. 通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持.因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处.由于这些文件直接通过Web服务器来提供下载,后端脚本无法对这个下载过程进行控制.这对于仅提供公开.静态文件的网站来说不是问题,但对于需要

  • php+resumablejs实现的分块上传 断点续传功能示例

    本文实例讲述了php+resumablejs实现的分块上传 断点续传功能.分享给大家供大家参考,具体如下: resumablejs官网 http://www.resumablejs.com/ 本站下载地址. upload.html <!DOCTYPE html> <html lang="en"> <div> <a href="#" rel="external nofollow" id="brow

  • 解决PHP超大文件下载,断点续传下载的方法详解

    最近导出的时候出现一个php内存溢出的问题,原因就是在于下载的时候读取生成的临时文件过大,PHP内存无法容纳,一开如是想到更改PHP内存限制,但是这个只是一个缓兵之计,于是想到了另外一个方法是把文件分次读取,并下载. 以下是源代码: 复制代码 代码如下: <?php $sourceFile = "1.tmp"; //要下载的临时文件名 $outFile = "用户订单.xls"; //下载保存到客户端的文件名 $file_extension = strtolo

  • 前端js实现文件的断点续传 后端PHP文件接收

    早就听说过断点续传这种东西,前端也可以实现一下. 断点续传在前端的实现主要依赖着HTML5的新特性,所以一般来说在老旧浏览器上支持度是不高的 本文通过断点续传的简单例子(前端文件提交+后端PHP文件接收),理解其大致的实现过程 还是先以图片为例,看看最后的样子 一.一些知识准备 断点续传,既然有断,那就应该有文件分割的过程,一段一段的传. 以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串.数组的分割,我们可以可以使用slice方法来分割文件. 所以断点续传的最基本实现也就是:前端通

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

    本文实例讲述了php实现的支持断点续传的文件下载类及其用法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 通常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现. HTTP断点续传原理: Http头 Range.Content-Range() HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用

  • php下载远程文件类(支持断点续传)

    简易使用方法:  复制代码 代码如下: $object = new httpdownload(); $object->set_byfile($file)%N#H#%;//服务器文件名,包括路径 $object->filename = $filename;//下载另存为的文件名 $object->download(); 3.源文件: 复制代码 代码如下: <? class httpdownload { var $data = null; var $data_len = 0; var

随机推荐