php可以一次下载几个文件(php实现大文件断点续传下载实例代码)
类别:编程学习 浏览量:1211
时间:2021-10-14 00:05:20 php可以一次下载几个文件
php实现大文件断点续传下载实例代码php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到。
|
require_once ( 'download.class.php' ); date_default_timezone_set( 'Asia/Shanghai' ); error_reporting (E_STRICT); function errorHandler( $errno , $errstr , $errfile , $errline ) { echo '<p>error:' , $errstr , '</p>' ; exit (); } set_error_handler( 'errorHandler' ); define( 'IS_DEBUG' , true); $filePath = 'test.zip' ; $mimeType = 'audio/x-matroska' ; $range = isset( $_SERVER [ 'HTTP_RANGE' ]) ? $_SERVER [ 'HTTP_RANGE' ] : null; if (IS_DEBUG) { // $range = "bytes=1000-1999\n2000"; // $range = "bytes=1000-1999,2000"; // $range = "bytes=1000-1999,-2000"; // $range = "bytes=1000-1999,2000-2999"; } set_time_limit(0); $transfer = new Transfer( $filePath , $mimeType , $range ); if (IS_DEBUG) { $transfer ->setIsLog(true); } $transfer ->send(); |
download.class.php
|
/** * 文件传输,支持断点续传。 * 2g以上超大文件也有效 * @author MoXie */ class Transfer { /** * 缓冲单元 */ const BUFF_SIZE = 5120; // 1024 * 5 /** * 文件地址 * @var <String> */ private $filePath ; /** * 文件大小 * @var <String> Php超大数字 字符串形式描述 */ private $fileSize ; /** * 文件类型 * @var <String> */ private $mimeType ; /** * 请求区域(范围) * @var <String> */ private $range ; /** * 是否写入日志 * @var <Boolean> */ private $isLog = false; /** * * @param <String> $filePath 文件路径 * @param <String> $mimeType 文件类型 * @param <String> $range 请求区域(范围) */ function __construct( $filePath , $mimeType = null, $range = null) { $this ->filePath = $filePath ; $this -> fileSize = sprintf( '%u' , filesize ( $filePath )); $this ->mimeType = ( $mimeType != null) ? $mimeType : "application/octet-stream" ; // bin $this ->range = trim( $range ); } /** * 获取文件区域 * @return <Map> {'start':long,'end':long} or null */ private function getRange() { /** * Range: bytes=-128 * Range: bytes=-128 * Range: bytes=28-175,382-399,510-541,644-744,977-980 * Range: bytes=28-175\n380 * type 1 * RANGE: bytes=1000-9999 * RANGE: bytes=2000-9999 * type 2 * RANGE: bytes=1000-1999 * RANGE: bytes=2000-2999 * RANGE: bytes=3000-3999 */ if (! empty ( $this ->range)) { $range = preg_replace( '/[\s|,].*/' , '' , $this ->range); $range = explode ( '-' , substr ( $range , 6)); if ( count ( $range ) < 2) { $range [1] = $this -> fileSize ; // Range: bytes=-100 } $range = array_combine ( array ( 'start' , 'end' ), $range ); if ( empty ( $range [ 'start' ])) { $range [ 'start' ] = 0; } if (!isset( $range [ 'end' ]) || empty ( $range [ 'end' ])) { $range [ 'end' ] = $this -> fileSize ; } return $range ; } return null; } /** * 向客户端发送文件 */ public function send() { $fileHande = fopen ( $this ->filePath, 'rb' ); if ( $fileHande ) { // setting ob_end_clean(); // clean cache ob_start(); ini_set ( 'output_buffering' , 'Off' ); ini_set ( 'zlib.output_compression' , 'Off' ); $magicQuotes = get_magic_quotes_gpc(); // set_magic_quotes_runtime(0); // init $lastModified = gmdate ( 'D, d M Y H:i:s' , filemtime ( $this ->filePath)) . ' GMT' ; $etag = sprintf( 'w/"%s:%s"' , md5( $lastModified ), $this -> fileSize ); $ranges = $this ->getRange(); // headers header(sprintf( 'Last-Modified: %s' , $lastModified )); header(sprintf( 'ETag: %s' , $etag )); header(sprintf( 'Content-Type: %s' , $this ->mimeType)); $disposition = 'attachment' ; if ( strpos ( $this ->mimeType, 'image/' ) !== FALSE) { $disposition = 'inline' ; } header(sprintf( 'Content-Disposition: %s; filename="%s"' , $disposition , basename ( $this ->filePath))); if ( $ranges != null) { if ( $this ->isLog) { $this ->log(json_encode( $ranges ) . ' ' . $_SERVER [ 'HTTP_RANGE' ]); } header( 'HTTP/1.1 206 Partial Content' ); header( 'Accept-Ranges: bytes' ); header(sprintf( 'Content-Length: %u' , $ranges [ 'end' ] - $ranges [ 'start' ])); header(sprintf( 'Content-Range: bytes %s-%s/%s' , $ranges [ 'start' ], $ranges [ 'end' ], $this -> fileSize )); // fseek ( $fileHande , sprintf( '%u' , $ranges [ 'start' ])); } else { header( "HTTP/1.1 200 OK" ); header(sprintf( 'Content-Length: %s' , $this -> fileSize )); } // read file $lastSize = 0; while (! feof ( $fileHande ) && !connection_aborted()) { $lastSize = sprintf( "%u" , bcsub( $this -> fileSize , sprintf( "%u" , ftell ( $fileHande )))); if ( bccomp ( $lastSize , self::BUFF_SIZE) > 0) { $lastSize = self::BUFF_SIZE; } echo fread ( $fileHande , $lastSize ); ob_flush(); flush (); } set_magic_quotes_runtime( $magicQuotes ); ob_end_flush(); } if ( $fileHande != null) { fclose( $fileHande ); } } /** * 设置记录 * @param <Boolean> $isLog 是否记录 */ public function setIsLog( $isLog = true) { $this ->isLog = $isLog ; } /** * 记录 * @param <String> $msg 记录信息 */ private function log( $msg ) { try { $handle = fopen ( 'transfer_log.txt' , 'a' ); fwrite( $handle , sprintf( '%s : %s' . PHP_EOL, date ( 'Y-m-d H:i:s' ), $msg )); fclose( $handle ); } catch (Exception $e ) { // null; } } } |
总结
以上所述是小编给大家介绍的php实现大文件断点续传下载实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
原文链接:https://www.cnblogs.com/mrlime/archive/2019/10/01/11615025.html
您可能感兴趣
- php连接数据库拒绝使用域名(访问php时提示内存位置访问无效的解决办法和思路分析)
- thinkphp实战教程之博客技术学习(python3编写ThinkPHP命令执行Getshell的方法)
- php多维数组怎么转换json(php实现的数组转xml案例分析)
- thinkphp数据库使用(thinkphp3.2同时连接两个数据库的简单方法)
- php语法检测方法(php中文语义分析实现方法示例)
- php数组练习题答案(PHP 数组黑名单/白名单实例代码详解)
- think php上传服务器(ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例)
- php网站经典案例(PHP生成短网址的思路以及实现方法的详解)
- phpstudy怎么修改mysql版本(PhpStudy集成环境升级MySQL数据库版本的方法)
- php验证码实现过程(php伪静态验证码不显示的解决方案)
- php编写程序使用方法(php xhprof使用实例详解)
- php八大模式详解(php设计模式之工厂模式用法经典实例分析)
- php函数使用教程讲解(php函数式编程简单示例)
- 在php中与数据库连接的技术(PHP7.0连接DB操作实例分析基于mysqli)
- php怎么设置静态成员函数(php输出控制函数和输出函数生成静态页面)
- php联合注入列表总结(php中的依赖注入实例详解)
- 心理学 四个金蟾,哪个最招财 测你今生的运势有多棒(心理学四个金蟾)
- 吉善缘《聚宝金蟾》金蟾招财摆件 三足全铜蟾蜍客厅店铺开业礼品(吉善缘聚宝金蟾金蟾招财摆件)
- 招财化煞神兽,金蟾变了(招财化煞神兽金蟾变了)
- 26岁杨紫的白素贞遇上24岁鞠婧祎,哪个最美(26岁杨紫的白素贞遇上24岁鞠婧祎)
- 鞠婧祎和杨紫两种风格的女生,你心里谁比较美(鞠婧祎和杨紫两种风格的女生)
- 三千年第一美女鞠婧祎出演白素贞pk杨紫,颜值胜赵雅芝王祖贤(三千年第一美女鞠婧祎出演白素贞pk杨紫)
热门推荐
- JavaScript 阻止超链接跳转的操作方法(多种写法)(JavaScript 阻止超链接跳转的操作方法多种写法)
- mysql的四种关系运算(详解MySQL拼接函数CONCAT的使用心得)
- SQL中的运算符
- dockerfile启动容器服务(docker文件存放路径, 获取容器启动命令操作)
- python获取excelsheet名称(python查询文件夹下excel的sheet名代码实例)
- dockernginx怎么设置容器(docker nginx + https 子域名配置详细教程)
- docker安装部署及使用(docker在linux上的安装部署实例讲解)
- 云服务器操作系统怎么选(云服务器选择Linux还是windows操作系统比较好?)
- docker 容器相关问题(docker空间爆满导致的进入容器失败的解决方案)
- vscode react插件(基于visual studio code + react 开发环境搭建过程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9