php 2g文件,php 超大文件下载类 支持2g以上文件 支持断点续传_PHP教程 - range

9c98fe03383ffeca78ca12f3181f2137.png

从函数签名中我们可以知道: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值