PHP实现文件下载断点续传

<?php

/*
 * PHP下载断点续传
 * from:php100
 */
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("文件不存在!");
   }
}
?>
//该片段来自于http://www.codesnippet.cn/detail/24112012641.html

来源地址: http://www.phpxs.com/code/1009963/

时间: 2024-10-06 00:45:14

PHP实现文件下载断点续传的相关文章

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

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

大文件下载--断点续传--NSURLConnection

有了上一篇文章的铺垫直接上代码,下面是分析原理. // ViewController.m // 大文件下载 // Created by apple on 15/11/11. // Copyright © 2015年 LDSmallCat. All rights reserved. #import "ViewController.h" #import "DACircularProgressView.h"//进度条的第三方框架 @interface ViewContro

网络编程之断点续传

>断点续传 1 在start方法中创建NSURLSession,并且绑定代理,注意不能使用block代码,否则不执行代理方法 2 开始下载,利用nsurlsession对象创建下载任务task 暂停下载,获取resumeData,resumeData中包含继续下载的开始位置信息 恢复下载,从resumeData中获取断点信息,继续下载 3 实现三个必要的代理方法,在代理方法中获取下载信息 在监控任务下载的代理方法downloadTask中写文件到沙盒 在 代理方法中更新UI视图(进度条) 在结束

NSFileManager 的基本使用方法

本方法已有个人总结, int main(int argc, const char * argv[]) { @autoreleasepool { NSString *[email protected]"/Users/tang/Desktop/123"; NSString *[email protected]"/Users/tang/Desktop/123/123.txt"; //用于获取单例对象,快速创建对象的方法, //单例对象:在程序运行期间只有一个对象, NSF

一些免费收费api收藏

转载:http://blog.csdn.net/sdjianfei/article/details/53157334 一 .api 1.http://apistore.baidu.com/astore/servicesearch?word=%E5%85%8D%E8%B4%B9&isFree=1 百度api集市 2.https://developers.douban.com/wiki/?title=guide 豆瓣开放 ,仅向企业开放 3.http://open.taobao.com/?spm=a

移动端开发者福利-免费收费api收藏

一 .api 1.https://www.juhe.cn/ 跟百度api集市差不多,超级赞,做好认证就行了,我有20+认证能用的免费api 2.http://apistore.baidu.com/astore/servicesearch?word=%E5%85%8D%E8%B4%B9&isFree=1 百度api集市 3.https://developers.douban.com/wiki/?title=guide 豆瓣开放 ,仅向企业开放 4.http://open.taobao.com/?s

[转载]http协议 文件下载原理及多线程断点续传

最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下来比较好.起初只是想研究研究,但后来发现写个可重用性比较高的模块还是很有必要的,我想这也是大多数开发人员的习惯吧.对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可: GET /Path/FileName HTTP/1.0 Host: www.server.com:80 Accept: */* User-Agent: GeneralDownloadApplication Connection: close 每行用一个“回

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传)

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传) 背景 断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全! 效果 实现 下载和之前的http请求可以相互独立,所以我们单独给download建立一个工程moudel处理 1.创建service接口 和以前一样,先写接口 注意:Streaming是判断是否写入内存的标示,如果小文件可以

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

php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现. HTTP断点续传原理Http头 Range.Content-Range()HTTP头中一般断点下载时才用到Range和Content-Range实体头,Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-3