ホームページ  >  記事  >  バックエンド開発  >  PHP の超大規模ファイル ダウンロード クラスは 2g を超えるファイルをサポートし、ブレークポイントをサポートします。resume_PHP チュートリアル

PHP の超大規模ファイル ダウンロード クラスは 2g を超えるファイルをサポートし、ブレークポイントをサポートします。resume_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:07:241283ブラウズ

002 /**

003 * ファイル送信、転送再開のサポート。

004 * 2g を超える非常に大きなファイルも有効です

005 * @author MoXie

006*/

007 クラス転送 {

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 プライベート $fileSize; 

022 /**

023 * ファイルタイプ

024 * @var

025*/

026 プライベート $mimeType; 

027 /**

028 * リクエスト領域(範囲)

029 * @var

030*/

031 プライベート $range; 

032 /**

033 * ログに書き込むかどうか

034 * @var

035*/

036 プライベート $isLog = false; 

037 /**

038 *

039 * @param $filePath ファイルのパス

040 * @param ファイルの種類

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} または null

052*/

053 プライベート関数 getRange() {

054 /** 

055 * 範囲: bytes=-128

056 * 範囲: bytes=-128

057 * 範囲: bytes=28-175,382-399,510-541,644-744、 977-980

058 * 範囲: bytes=28-175n380

059 * タイプ 1

060 * 範囲: bytes=1000-9999

061 * RANGE: bytes=2000-9999

062 * タイプ 2

063 * 範囲: bytes=1000-1999

064 * 範囲: バイト=2000-2999

065 * 範囲: バイト=3000-3999

066         */

067 if (!empty($this-&g t;範囲) ) {

068 $range = preg_replace('/[s|,].*/','',$this->range); 

069 $range =explode('-',substr($range,6)); 

070 if (count($range)

071 $range[1] = $this->fileSize; // 範囲: 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->ファイルサイズ; 

079 }

080 $range を返します。 

081 }

082 null を返します。 

083 }

084 /**

085 *クライアントにファイルを送信

086*/

087 パブリック関数 send() {

088 $fileHande = fopen($this->filePath, 'rb'); 

089 if ($fileHande) {

090 // 設定

091 ob_end_clean();// キャッシュのクリーン

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 // ヘッダー

102 header(sprintf('Last-Modified: %s',$lastModified)); 

103 header(sprintf('ETag: %s',$etag)); 

104 header(sprintf('Content-Type: %s',$this->mimeType)); 

105 $disposition = '添付ファイル'; 

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 部分コンテンツ'); 

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 // ファイルを読み取る

126 $lastSize = 0; 

127 while(!feof($fileHande) && !connection_aborted()) {

128 $lastSize = sprintf("%u", bcsub($this->fileSize,sprintf("%u",ftell($ファイルハンド)))); 

129 if (bccomp($lastSize,self::BUFF_SIZE) > 0) {

130 $lastSize = self::BUFF_SIZE; 

131 }

132 echo fread($fileHande, $lastSize); 

133 flash(); 

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 = $ログ; 

149 }

150 /**

151 * レコード

152 * @param $msg レコード情報

153*/

154 プライベート関数ログ($msg) {

155 試してみる {

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('アジア/上海'); 

165 エラー報告(E_STRICT); 

166 function errorHandler($errno, $errstr, $errfile, $errline) {

167 echo '

error:',$errstr,'

'; 

168 exit(); 

169 }

170 set_error_handler('errorHandler'); 

171 定義('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 ?>


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/444968.html技術記事 ?php教程 002 /** 003 * SPAN class=t_tag onclick=tagshow(event) href=tag.php?name=%CE%C4%BC%FE文件/SPAN传输,断点续传をサポート。 004 * 2g以上超大文件也有效 005 * @...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。