PHP 大文件下载(方式3 支持断点续传)

简介:

/服务器文件路径,下载文件名字(默认为服务器文件名),是否许可用户下载方式(默认可选),速度限制(默认自动),文件类型(默认所有) 可能是服务器原因 配置较低 下载一段服务器会崩溃 下载也会停止/
public function downFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '') { 
if (!is_readable($fileName)) 

header("HTTP/1.1 404 Not Found"); 
return false; 
}

$fileStat = stat($fileName); 
$lastModified = $fileStat['mtime']; 

$md5 = md5($fileStat['mtime'] .'='. $fileStat['ino'] .'='. $fileStat['size']); 
$etag = '"' . $md5 . '-' . crc32($md5) . '"'; 

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

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) 
{ 
    header("HTTP/1.1 304 Not Modified"); 
    return true; 
} 

if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) < $lastModified) 
{ 
    header("HTTP/1.1 304 Not Modified"); 
    return true; 
} 

if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&  $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) 
{ 
    header("HTTP/1.1 304 Not Modified"); 
    return true; 
} 

if ($fancyName == '') 
{ 
    $fancyName = basename($fileName); 
} 

if ($contentType == '') 
{ 
    $contentType = 'application/octet-stream'; 
} 

$fileSize = $fileStat['size']; 

$contentLength = $fileSize; 
$isPartial = false; 

if (isset($_SERVER['HTTP_RANGE'])) 
{ 
    if (preg_match('/^bytes=(\d*)-(\d*)$/', $_SERVER['HTTP_RANGE'], $matches)) 
    { 
        $startPos = $matches[1]; 
        $endPos = $matches[2]; 

        if ($startPos == '' && $endPos == '') 
        { 
            return false; 
        } 

        if ($startPos == '') 
        { 
            $startPos = $fileSize - $endPos; 
            $endPos = $fileSize - 1; 
        } 
        else if ($endPos == '') 
        { 
            $endPos = $fileSize - 1; 
        } 

        $startPos = $startPos < 0 ? 0 : $startPos; 
        $endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos; 

        $length = $endPos - $startPos + 1; 

        if ($length < 0) 
        { 
            return false; 
        } 

        $contentLength = $length; 
        $isPartial = true; 
    } 
} 

// send headers 
if ($isPartial) 
{ 
    header('HTTP/1.1 206 Partial Content'); 
    header("Content-Range: bytes $startPos-$endPos/$fileSize"); 

} 
else 
{ 
    header("HTTP/1.1 200 OK"); 
    $startPos = 0; 
    $endPos = $contentLength - 1; 
} 

header('Pragma: cache'); 
header('Cache-Control: public, must-revalidate, max-age=0'); 
header('Accept-Ranges: bytes'); 
header('Content-type: ' . $contentType); 
header('Content-Length: ' . $contentLength); 

if ($forceDownload) 
{ 
    header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"'); 
} 

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

$bufferSize = 2048; 

if ($speedLimit != 0) 
{ 
    $packetTime = floor($bufferSize * 1000000 / $speedLimit); 
} 

$bytesSent = 0; 
$fp = fopen($fileName, "rb"); 
fseek($fp, $startPos); 
while ($bytesSent < $contentLength && !feof($fp) && connection_status() == 0 ) 
{ 
    if ($speedLimit != 0) 
    { 
        list($usec, $sec) = explode(" ", microtime()); 
        $outputTimeStart = ((float)$usec + (float)$sec); 
    } 

    $readBufferSize = $contentLength - $bytesSent < $bufferSize ? $contentLength - $bytesSent : $bufferSize; 
    $buffer = fread($fp, $readBufferSize); 

    echo $buffer; 

    ob_flush(); 
    flush(); 

    $bytesSent += $readBufferSize; 

    if ($speedLimit != 0) 
    { 
        list($usec, $sec) = explode(" ", microtime()); 
        $outputTimeEnd = ((float)$usec + (float)$sec); 

        $useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000; 
        $sleepTime = round($packetTime - $useTime); 
        if ($sleepTime > 0) 
        { 
            usleep($sleepTime); 
        } 
    } 
} 
return true; 

}

public function download(){

    $id = input('id');
    $item = Db::name('imgsubmit')->where(['id'=>$id])->find();
    Db::name('imgsubmit')->where(['id'=>$id])->update(['status'=>1]);
    $tt = ltrim($item['zip'],'uploads/');
    $path = config('upload_path').DS.$tt;
    $arr = explode('/',$path);
    $iname=$item['username'].'_'.$item['order_no'];
    //
    /*$filename = $arr[count($arr)-1];*/
    $filename=$iname.'.zip';
    //$file  =  fopen($path, "rb");
    //$flag = $this->downFile($path); 
    $flag =  $this->downloadob($path, $filename, true); // 断点续传  
    exit ();
}















本文转自lb沫51CTO博客,原文链接:http://blog.51cto.com/13562606/2066550,如需转载请自行联系原作者
相关文章
|
1月前
thinkphp5.1隐藏index.php入口文件
thinkphp5.1隐藏index.php入口文件
30 0
thinkphp5.1隐藏index.php入口文件
|
3月前
|
PHP 数据安全/隐私保护
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)