php 2g文件,php 超大文件下载类 支持2g以上文件 支持断点续传_PHP教程 - range
从函数签名中我们可以知道:In [7]: random.randrange?
Signature: random.randrange(start, stop=None, step=1, _int=, _maxwidth=9007199254740992L)
Docstring:
Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes ...
002 /**
003 * 文件传输,支持断点续传。
004 * 2g以上超大文件也有效
005 * @author MoXie
006 */
007 class Transfer {
008 /**
009 * 缓冲单元
010 */
011 const BUFF_SIZE = 5120; // 1024 * 5
012 /**
013 * 文件地址
014 * @var
015 */
016 private $filePath;
017 /**
018 * 文件大小
019 * @var Php超大数字 字符串形式描述
020 */
021 private $fileSize;
022 /**
023 * 文件类型
024 * @var
025 */
026 private $mimeType;
027 /**
028 * 请求区域(范围)
029 * @var
030 */
031 private $range;
032 /**
033 * 是否写入日志
034 * @var
035 */
036 private $isLog = false;
037 /**
038 *
039 * @param $filePath 文件路径
040 * @param $mimeType 文件类型
041 * @param $range 请求区域(范围)
042 */
043 function __construct($filePath, $mimeType = null , $range = null) {
044 $this->filePath = $filePath;
045 $this->fileSize = sprintf('%u',filesize($filePath));
046 $this->mimeType = ($mimeType != null)?$mimeType:"application/octet-stream"; // bin
047 $this->range = trim($range);
048 }
049 /**
050 * 获取文件区域
051 * @return {'start':long,'end':long} or null
052 */
053 private function getRange() {
054 /**
055 * Range: bytes=-128
056 * Range: bytes=-128
057 * Range: bytes=28-175,382-399,510-541,644-744,977-980
058 * Range: bytes=28-175n380
059 * type 1
060 * RANGE: bytes=1000-9999
061 * RANGE: bytes=2000-9999
062 * type 2
063 * RANGE: bytes=1000-1999
064 * RANGE: bytes=2000-2999
065 * RANGE: bytes=3000-3999
066 */
067 if (!empty($this->range)) {
068 $range = preg_replace('/[s|,].*/','',$this->range);
069 $range = explode('-',substr($range,6));
070 if (count($range) < 2 ) {
071 $range[1] = $this->fileSize; // Range: bytes=-100
072 }
073 $range = array_combine(array('start','end'),$range);
074 if (empty($range['start'])) {
075 $range['start'] = 0;
076 }
077 if (!isset ($range['end']) || empty($range['end'])) {
078 $range['end'] = $this->fileSize;
079 }
080 return $range;
081 }
082 return null;
083 }
084 /**
085 * 向客户端发送文件
086 */
087 public function send() {
088 $fileHande = fopen($this->filePath, 'rb');
089 if ($fileHande) {
090 // setting
091 ob_end_clean();// clean cache
092 ob_start();
093 ini_set('output_buffering', 'Off');
094 ini_set('zlib.output_compression', 'Off');
095 $magicQuotes = get_magic_quotes_gpc();
096 set_magic_quotes_runtime(0);
097 // init
098 $lastModified = gmdate('D, d M Y H:i:s', filemtime($this->filePath)).' GMT';
099 $etag = sprintf('w/"%s:%s"',md5($lastModified),$this->fileSize);
100 $ranges = $this->getRange();
101 // headers
102 header(sprintf('Last-Modified: %s',$lastModified));
103 header(sprintf('ETag: %s',$etag));
104 header(sprintf('Content-Type: %s',$this->mimeType));
105 $disposition = 'attachment';
106 if (strpos($this->mimeType,'image/') !== FALSE) {
107 $disposition = 'inline';
108 }
109 header(sprintf('Content-Disposition: %s; filename="%s"',$disposition,basename($this->filePath)));
110
111 if ($ranges != null) {
112 if ($this->isLog) {
113 $this->log(json_encode($ranges).' '.$_SERVER['HTTP_RANGE']);
114 }
115 header('HTTP/1.1 206 Partial Content');
116 header('Accept-Ranges: bytes');
117 header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start']));
118 header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'], $ranges['end'],$this->fileSize));
119 //
120 fseek($fileHande, sprintf('%u',$ranges['start']));
121 }else {
122 header("HTTP/1.1 200 OK");
123 header(sprintf('Content-Length: %s',$this->fileSize));
124 }
125 // read file
126 $lastSize = 0;
127 while(!feof($fileHande) && !connection_aborted()) {
128 $lastSize = sprintf("%u", bcsub($this->fileSize,sprintf("%u",ftell($fileHande))));
129 if (bccomp($lastSize,self::BUFF_SIZE) > 0) {
130 $lastSize = self::BUFF_SIZE;
131 }
132 echo fread($fileHande, $lastSize);
133 flush();
134 ob_flush();
135 }
136 set_magic_quotes_runtime($magicQuotes);
137 ob_end_flush();
138 }
139 if ($fileHande != null) {
140 fclose($fileHande);
141 }
142 }
143 /**
144 * 设置记录
145 * @param $isLog 是否记录
146 */
147 public function setIsLog($isLog = true) {
148 $this->isLog = $isLog;
149 }
150 /**
151 * 记录
152 * @param $msg 记录信息
153 */
154 private function log($msg) {
155 try {
156 $handle = fopen('transfer_log.txt', 'a');
157 fwrite($handle, sprintf('%s : %s'.PHP_EOL,date('Y-m-d H:i:s'),$msg));
158 fclose($handle);
159 }catch(Exception $e) {
160 // null;
161 }
162 }
163 }
164 date_default_timezone_set('Asia/Shanghai');
165 error_reporting(E_STRICT);
166 function errorHandler($errno, $errstr, $errfile, $errline) {
167 echo '
error:',$errstr,'';
168 exit();
169 }
170 set_error_handler('errorHandler');
171 define('IS_DEBUG',true);
172
173 //
174 //
175 $filePath = '/Movie/The.Hurt.Locker.2008.x264.AC3-WAF.mkv';
176 $mimeType = 'audio/x-matroska';
177 $range = isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null;
178 if (IS_DEBUG) {
179 // $range = "bytes=1000-1999n2000";
180 // $range = "bytes=1000-1999,2000";
181 // $range = "bytes=1000-1999,-2000";
182 // $range = "bytes=1000-1999,2000-2999";
183 }
184 set_time_limit(0);
185 $transfer = new Transfer($filePath,$mimeType,$range);
186 if (IS_DEBUG) {
187 $transfer->setIsLog(true);
188 }
189 $transfer->send();
190 ?>
http://www.bkjia.com/PHPjc/444968.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444968.htmlTechArticle?php教程 002 /** 003 * SPAN class=t_tag οnclick=tagshow(event) href=tag.php?name=%CE%C4%BC%FE文件/SPAN传输,支持断点续传。 004 * 2g以上超大文件也有效 005 * @...
从函数签名中我们可以知道:In [7]: random.randrange?
Signature: random.randrange(start, stop=None, step=1, _int=, _maxwidth=90071992547409
一、unicode-range是什么?
一看名称,很多小伙伴可能认为是个什么生僻的东西,实际上,这玩意只是名字怪怪的,功能关键时刻还是很管用的。
unicode-range是一个CSS属性,一般和@font-face规则一起使...
本篇文章给大家带来的内容是介绍css3的:out-of-range和:in-range伪类有什么用?(代码示例),让大家了解:out-of-range伪类和:in-range伪类的作用和使用方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
从函数签名中我们可以知道:In [7]: random.randrange?
Signature: random.randrange(start, stop=None, step=1, _int=, _maxwidth=90071992547409
本篇文章主要介绍的是php数组函数rang的用法,对于抽奖类的应用,文章末尾有举例说明。
PHP函数range()快速创建数组的方法比如range()函数可以快速创建从1到9的数字数组:
$numbers=range(1,9);//用range直接创建1-9且1...
...常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现。
HTTP断点续传原理:
Http头 Range、Content-Range()
HTTP头中一般断点下载时才用到Range和Content-Range实体头,
Range用户请求头中,指定第...
...e cellspacing="0" cellpadding="0">
本文介绍下,在php中用range函数,创建包含指定范围单元的数组的例子,有需要的朋友参考下。之前,我们介绍过一篇 php快速创建数组的方法,其中就用到了php range()函数。
本文介绍下,...
...turn false;
}
$size = filesize ( $real );
$size2 = $size - 1;
$range = 0;
if (isset ( $_SERVER ['HTTP_RANGE'] )) {
header ( 'HT
本篇文章给大家带来的内容是关于基于http Range Requests协议实现分片下载的功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。本文基于http Range Requests协议,实现了分片下载的功能。使用场景...
... 参数只接受字符串类型的值
private static $range = 'sys';
//7个方法
/**
* 设定配置参数的作用域&nbs
POWERED BY ©点凡CMS-PHP技术站 ALL RIGHTS RESERVED 本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理(363623854#qq.com)
php 2g文件,php 超大文件下载类 支持2g以上文件 支持断点续传_PHP教程 - range相关推荐
- java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?
上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...
- php 访问类成员,PHP类成员的访问方式和权限_PHP教程
PHP5的访问方式允许限制对类成员的访问. 这是在PHP5中新增的功能,但在许多面向对象语言中都早已存在. 有了访问方式,才能开发一个可靠的面向对象应用程序,并且构建可重用的面向对象类库. 像C++和 ...
- php 断点续传,php支持断点续传的文件下载类(附源码)
/** php下载类,支持断点续传 * Date: 2013-06-30 * Author: fdipzone * Ver: 1.0 * edit: ww.jbxue.com * Func: * do ...
- java上传大文件_Java超大文件上传解决办法
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- Spring MVC 文件上传 文件下载
索引: 目录索引 参看代码 GitHub: pom.xml WebConfig.java index.jsp upload.jsp FileUploadController.java Files_Ut ...
- html转pdf文件下载之最合理的方法支持中文
目录 原始源码出处: 参考资料: 正文: 加上字体赋值行,仅需六行代码就可以实现网页元素转为 PDF 文档. 完整源码下载: 原始源码出处: https://github.com/parallax/j ...
- 超大Excel读取和写出(支持50万+)(一)
超大Excel读取和写出(支持50万+) 一.现状 假设我们的测试或生产环境的内存条件有限,比如说2GB(当然小数据的导入和导出不在本文的讨论范围,因为导入和导出它们几乎不存在内存溢出问题). 这里, ...
- web漏洞(CSRF-SSRF-文件包含-文件解释-文件下载-目录遍历-sql注入-文件上传-反序列化-XSS-XXE-RCE-逻辑越权)
1.CSRF(跨站请求伪造)(需要对方是在登录的情况下)--主要用于骗转账等等 原理:A在已经登录了银行的网站,并且此时去访问了B所构造的网页添加了特殊代码,A点击了B,由于A已经登录了,就造成了A直 ...
- php 下载文件 类库,thinkphp 文件下载 文件下载php | 学步园
THinkPHP1.5中文件的下载 用到的系统类库文件是Http.class.php,位于ThinkPHP\Lib\ORG\Net目录下,类名Http,其中有静态方法 static function ...
最新文章
- 你分得清分布式、高并发与多线程吗?
- Spring 多数据源事务配置问题
- Nginx面试!mysql时间类型以及获取当前时间,干货满满
- CTO在企业技术创新中的作用和地位
- 支付宝当面付扫码支付支付后不回调_科普:支付宝刷脸支付流程介绍
- Java面试宝典系列之基础面试题String、变量、类与对象、集合类、SSH(三)
- ant+jmeter中build.xml配置详解
- Scala _05集合_数组(一)
- exls导入数据库 php_PHP Excel导入数据到MySQL数据库
- 操作系统中的处理机调度调度_操作系统中的流程分类和调度
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
- VS2008 快捷键 大全
- Hadoop2.x环境搭建
- 一个播放器引发的思考——谈谈React跨组件通信
- oracle表分析效果怎么看,Oracle 索引与表分析几种方法
- 王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
- javaWeb+servlet+mysql实现简单的企业员工管理系统
- 操作系统实验ucore lab1
- opengl 加载obj模型
- 用计算机如何扫描文件,打印机扫描文件到电脑方法教程