Home Backend Development PHP Tutorial PHP large file download program [http cache negotiation, Etag mark, breakpoint resume]_PHP tutorial

PHP large file download program [http cache negotiation, Etag mark, breakpoint resume]_PHP tutorial

Jul 20, 2016 am 11:07 AM
Dow file http path php Tutorial Download Document breakpoint mark program cache Extra large

<?php tutorial

002 $file_path = './download/download_cn.rar';

003

004 //How to use

005 downFile($file_path);

006

007 // Server file path, download file name (default is server file name), whether to allow user download method (default optional) , speed limit (default automatic), file type (default all)

008 function downFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '') {

009 if (!is_readable($fileName))

010 {

011 header("HTTP/1.1 404 Not Found");

012 return false; ]; 

017                                                       ']);

019 $etag = '"' . $md5 . '-' . crc32($md5) . '"';

020

021 header ('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT');

022 header("ETag: $etag");

023 

024 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) 

025 {

026 header("HTTP/1.1 304 Not Modified");

027 return true;

028 }

029

0 30 if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) < $lastModified)

031 {

032 header("HTTP/1.1 304 Not Modified");

033 return true;

034 }

035 & $ _SERVER['HTTP_IF_NONE_MATCH'] == $etag)

037 {

038 header("HTTP/1.1 304 Not Modified");

039 return true;

040 }  

041                                                                                                                                              $ fileName); $ contentType = 'application/octet-stream';

050 }

051

054 $contentLength = $fileSize;

055 $isPartial = false;

056

057 if (isset($_SERVER['HTTP_RANGE'] ))

058 {

059 if (preg_match('/^bytes=(d*)-(d*)$/', $_SERVER['HTTP_RANGE'], $matches) )                                                                                                     063 

064 if ($startPos == '' && $endPos == '')

065 {

066                 return false;  

067             }  

068     

069             if ($startPos == '')  

070             {  

071                 $startPos = $fileSize - $endPos;  

072                 $endPos = $fileSize - 1;  

073             }  

074             else if ($endPos == '')  

075             {  

076                 $endPos = $fileSize - 1;  

077             }  

078     

079             $startPos = $startPos < 0 ? 0 : $startPos;  

080             $endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos;  

081     

082             $length = $endPos - $startPos + 1;  

083     

084             if ($length < 0)  

085             {  

086                 return false;  

087             }  

088     

089             $contentLength = $length;  

090             $isPartial = true;  

091         }  

092     }  

093     

094     // send headers  

095     if ($isPartial)  

096     {  

097         header('HTTP/1.1 206 Partial Content');  

098         header("Content-Range: bytes $startPos-$endPos/$fileSize");  

099     

100     }  

101     else 

102     {  

103         header("HTTP/1.1 200 OK");  

104         $startPos = 0;  

105         $endPos = $contentLength - 1;  

106     }  

107     

108     header('Pragma: cache');  

109     header('Cache-Control: public, must-revalidate, max-age=0');  

110     header('Accept-Ranges: bytes');  

111     header('Content-type: ' . $contentType);  

112     header('Content-Length: ' . $contentLength);  

113     

114     if ($forceDownload)  

115     {  

116         header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"');  

117     }  

118     

119     header("Content-Transfer-Encoding: binary");  

120     

121     $bufferSize = 2048;  

122     

123     if ($speedLimit != 0)  

124     {  

125         $packetTime = floor($bufferSize * 1000000 / $speedLimit);  

126     }  

127     

128     $bytesSent = 0;  

129     $fp = fopen($fileName, "rb");  

130     fseek($fp, $startPos);  

131     while ($bytesSent < $contentLength && !feof($fp) && connection_status() == 0 )  

132     {  

133         if ($speedLimit != 0)  

134         {  

135             list($usec, $sec) = explode(" ", microtime());  

136             $outputTimeStart = ((float)$usec + (float)$sec);  

137         }  

138     

139         $readBufferSize = $contentLength - $bytesSent < $bufferSize ? $contentLength - $bytesSent : $bufferSize;  

140         $buffer = fread($fp, $readBufferSize);  

141     

142         echo $buffer;  

143     

144         ob_flush();  

145         flush();  

146     

147         $bytesSent += $readBufferSize;  

148     

149         if ($speedLimit != 0)  

150         {  

151             list($usec, $sec) = explode(" ", microtime());  

152             $outputTimeEnd = ((float)$usec + (float)$sec);  

153     

154             $useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000;  

155             $sleepTime = round($packetTime - $useTime);  

156             if ($sleepTime > 0)  

157             {  

158                 usleep($sleepTime);  

159             }  

160         }  

161     }  

162     return true;  

163 }  

164 ?>


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/444967.htmlTechArticle?php教程 002 $file_path = './download/download_cn.rar'; 003 004 //使用方法 005 downFile($file_path); 006 007 // 服务器文件路径,下载文件名字(默认为服务器文...
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

CakePHP Date and Time

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

CakePHP Project Configuration

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

CakePHP File upload

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

CakePHP Routing

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

Discuss CakePHP

CakePHP Quick Guide CakePHP Quick Guide Sep 10, 2024 pm 05:27 PM

CakePHP Quick Guide

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

How To Set Up Visual Studio Code (VS Code) for PHP Development

See all articles