一般來說,為了避免使用者上傳了什麼奇奇怪怪的檔案被執行,會將上傳的檔案放在網頁根目錄以外的地方,再利用 PHP 將檔案內容輸出給 Client。
最簡單的方法是用 readfile 這個函式直接將檔案內容輸出,然而如果允許上傳的檔案比較大的話, readfile 會一次將檔案讀到記憶體內,造成記憶體用量超出上限的問題。
這個不能單純將記憶體上限提高來解決,不然只要同時幾個人下載檔案就會造成伺服器記憶體用盡。我想目前最簡單的方法是利用 stream 的功能來做:
1 2 3 4 5 6 7 |
$srcStream = fopen($file, 'rb'); $dstStream = fopen('php://output', 'wb'); stream_copy_to_stream($srcStream, $dstStream); fclose($dstStream); fclose($srcStream); |
這樣子就可以了,經測試下載數百 MB 的檔案也不會直接造成 PHP 錯誤。