PHP Download File

若要讓 user 下載檔案時, 常常會直接把 URL 丟出給 Browser 去直接下載檔案, 此時會有 Apache 直接把 file stream 丟出去.

但如果要記錄 user 下載檔案的情況或下載次數, 那麼就需要用 PHP 的 fopen 來丟檔.

如果不做任何處理時, fopen 會把所有檔案先載入到記憶體後再丟給 client browser, 但這樣會變成記憶體一下子就被佔滿, 要解決這個方法還有可以使用 buffer 的方法, 先把要下載的檔案抓一部份放在 RAM 裡然後再丟出去, 如此就不用一次把檔案全都載完了, 也可以同這個方法來做流量限速的應用.

$FILE = '../upload/big-file.zip';
$FILE_NAME = big-file.zip;
if ($fd = fopen ($FILE, "r")) {
	header("Content-type: application/force-download");
	header("Content-Transfer-Encoding: Binary");
	header("Content-length: " . filesize($FILE));
	header("Content-disposition: attachment; filename=\"" . $FILE_NAME . "\"");
	while(!feof($fd)) {
		$buffer = fread($fd, 2048);
		echo $buffer;
		flush();
	}
	fclose ($fd);
}

這樣, 一次讀 2048 KB 再把 stream 丟出去, 可以有效防止 RAM 不足的情況.

Comments are closed.

十月 2019
« 五月    
 123456
78910111213
14151617181920
21222324252627
28293031  

Google ADs