分享一個超好用的php header下載函數

來源:互聯網
上載者:User

 這篇文章主要為大家分享一個超好用的php header下載函數,需要的朋友可以參考下

代碼如下:<?php/** * 傳送檔案 * * @author: legend(legendsky@hotmail.com) * @link: http://www.ugia.cn/?p=109 * @description: send file to client * @version: 1.0 * * @param string   $fileName      檔案名稱或路徑 * @param string   $fancyName     自訂的檔案名稱,為空白則使用filename * @param boolean  $forceDownload 是否強制下載 * @param integer  $speedLimit    速度限制,單位為位元組,0為不限制,不支援windows伺服器 * @param string   $$contentType  檔案類型,預設為application/octet-stream * * @return boolean */function sendFile($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). '"');//漢字自動轉為URL編碼  header('Content-Disposition: attachment; filename="' . $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);     //fpassthru($fp);     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;} ?>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.