<?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/

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

  1. C# 文件下载断点续传

    C# 文件下载断点续传的一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  2. php大文件下载+断点续传

    如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(Resumable Download),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继续下载,而不必重新下载整个文件. 通 ...

  3. B/S大文件下载+断点续传

    1.先将 webuploader-0.1.5.zip 这个文件下载下来:https://github.com/fex-team/webuploader/releases  根据个人的需求放置自己需要的 ...

  4. golang文件下载断点续传(下载客户端)

    客户端: //const ( // UA = "Golang Downloader from Kejibo.com" //) func DownloadController(ctx ...

  5. web大文件下载+断点续传

    实现原理(1)首先获得下载文件的长度,然后设置本地文件的长度.(2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置.如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条 ...

  6. jsp大文件下载+断点续传

    以多线程.断点续传方式下载文件,经常出现下载下来的文件大小和服务端一致,但是却无法正常打开的现象,搞了很久,贴下我的实现方式,请各位多多指教思路:1.将下载文件的处理放在自定义的线程类中,每下载一个文 ...

  7. java大文件下载+断点续传

    java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路:1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...

  8. Azure存储上传下载(断点续传)

    最近有一个客户需要将文件系统(VM搭建)迁移到Azure存储上,对于Azure存储这里就不多做介绍,但是该客户由于网络原因下载文件的时候经常出现上传中断,所以想在Azure 存储上实现下载的断点续传. ...

  9. 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程

    先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...

随机推荐

  1. mfc小工具开发之定时闹钟之---功能介绍

    使用背景: 之前在xp上用过飞雪日历,感觉挺好用的,还有在音频上的兴趣,促使了我也要自己做一个简单的定时闹钟. 之前开发过图片格式的小工具,没来的急分享,后期整理后,一块奉上,写这篇介绍的时候已近完成 ...

  2. 带圈星号用MathType可以编辑出来吗

    对于很多的数学领域的人来说,大家都知道数学符号往往并不是单一的,常常会出现在不同的场景下有不同的符号要求.比如带星号的运算符号,加减乘除等.对于乘号来说,有点乘叉乘和星乘三种,下面本MathType教 ...

  3. Python_selenium之处理Alert窗

    Python_selenium之处理Alert窗 一.介绍 1. 介绍如何通过switch_to方法处理网页Alert窗口 2. 然后我们自己创建一个alert弹窗进行操作 二.测试脚本 1. 测试脚 ...

  4. python3----练习题(冒泡排序)

    冒泡,原理是临近的数字两两进行比较,按照从小到大的顺序进行交换,这样交换一次之后,最大的数字就被交换到了最后一位. li = [33, 2, 10, 1] for j in range(1, len( ...

  5. Java常量池详解

    转自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虚拟内存分布图: 程序计数器:JVM执行程序的流水线. 本地方法栈:JVM调用操作系统方法所 ...

  6. 《转》Win7 IIS7.5 安装

    一.进入Win7的 控制面板,选择左侧的 打开或关闭Windows功能. 二.现在出现了安装Windows功能的选项菜单,注意选择的项目,我们需要手动选择需要的功能,下面这张图片把需要安装的服务都已经 ...

  7. iOS 将金钱变为逗号形式

    ; NSNumberFormatter * formatter = [NSNumberFormatter new]; [formatter setNumberStyle:NSNumberFormatt ...

  8. NavigationBar 背景颜色,字体颜色

    // 设置状态栏颜色 [application setStatusBarStyle:UIStatusBarStyleLightContent]; // 设置导航栏 [[UINavigationBar ...

  9. svn 插件去除已经保存的密码方法

    删除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn.simple文件夹下的文件即可. 再次访问时,会弹出要求输入 ...

  10. 第一个Gradle入门程序

    参考:http://www.importnew.com/15881.html 准备工作 1.gradle编译环境 下载gradle编译包(http://www.gradle.org/downloads ...