1. 程式人生 > 實用技巧 >PHP本地檔案&遠端檔案下載

PHP本地檔案&遠端檔案下載

 1 /**
 2  * @description  檔案下載 支援本地和遠端檔案
 3  * @param        $fileUrl  檔案本地絕對路徑 OR 遠端地址
 4  * @param string $fileName 下載儲存的檔名
 5  * @param bool   $isLocal  是否是本地檔案
 6  */
 7 function download_file($fileUrl, $fileName = '',$isLocal = true){
 8     if($fileName == ''){
 9         $filename = explode('/', str_replace
(DIRECTORY_SEPARATOR, '/', $fileUrl)); 10 $filename = end($filename); 11 }else{ 12 $filename = $fileName; 13 } 14 if($isLocal){ 15 if (!headers_sent()) { 16 if (file_exists($fileUrl) && !empty($filename)) { 17 $fileOpen = fopen($fileUrl
, 'rb'); 18 $fileSize = filesize($fileUrl); 19 header("Cache-Control: public");//快取控制 20 header("Content-Type: application/octet-stream"); 21 header("Accept-Ranges: bytes"); 22 header("Content-Length: " . $fileSize); 23 header
('Access-Control-Expose-Headers: Content-Disposition'); 24 header("Content-Disposition: attachment; filename=" . $filename); 25 $chunk_size = 4096; // 針對大檔案,規定每次讀取檔案的位元組數為4096位元組,直接輸出資料 26 $sum_buffer = 0; //總的緩衝的位元組數 27 ob_start(); // 開啟緩衝區 28 //只要沒到檔案尾,就一直讀取 29 while (!feof($fileOpen) && $sum_buffer < $fileSize) { 30 echo fread($fileOpen, $chunk_size); 31 $sum_buffer += $chunk_size; 32 ob_flush(); // 重新整理PHP緩衝區到Web伺服器 33 flush(); // 重新整理Web伺服器緩衝區到瀏覽器 34 } 35 ob_end_clean(); // 關閉緩衝區 36 fclose($fileOpen); 37 exit; 38 } 39 } 40 }else{ 41 $localTemporaryDir = FILE_UPLOAD.'uploads/temporary/';//此處注意改成自己專案配置的檔案下載目錄 42 if(!is_dir($localTemporaryDir)){ 43 mkdir($localTemporaryDir,0777,true); 44 } 45 $localFile = $localTemporaryDir . $fileName; 46 $ch = curl_init(); 47 curl_setopt($ch, CURLOPT_URL, $url); 48 curl_setopt($ch, CURLOPT_HEADER, FALSE); 49 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 50 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 900); 51 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 52 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 53 curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); 54 $file = curl_exec($ch); 55 curl_close($ch); 56 if(!strpos($file, '<Error>')){ 57 @unlink($localFile); 58 file_put_contents($localFile, $file); 59 } 60 if (file_exists($localFile)) { 61 download_file($localFile);//呼叫自己 62 } 63 } 64 }