您好,登錄后才能下訂單哦!
這篇文章主要介紹php是如何下載文件的,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
php下載文件的方法:1、從“$_GET['file']”得到文件路徑;2、設置header信息;3、使用“file_get_contents()”和“file()”方法;4、通過“readfile”和“fopen”方法。
PHP下載文件的方式
1. 得到文件路徑
從$_GET['file']得到文件路徑
$path_parts = pathinfo($_GET['file']); $file_name = $path_parts['basename']; $file_path = '/mysecretpath/' . $file_name;
務必使用上面這種方法得到路徑,不能簡單的字符串拼接得到路徑
$mypath = '/mysecretpath/' . $_GET['file'];
如果輸入的是../../,就可以訪問任何路徑
2. 設置header信息
header('Content-Description: File Transfer'); //描述頁面返回的結果 header('Content-Type: application/octet-stream'); //返回內容的類型,此處只知道是二進制流。具體返回類型可參考http://tool.oschina.net/commons header('Content-Disposition: attachment; filename='.basename($file));//可以讓瀏覽器彈出下載窗口 header('Content-Transfer-Encoding: binary');//內容編碼方式,直接二進制,不要gzip壓縮 header('Expires: 0');//過期時間 header('Cache-Control: must-revalidate');//緩存策略,強制頁面不緩存,作用與no-cache相同,但更嚴格,強制意味更明顯 header('Pragma: public'); header('Content-Length: ' . filesize($file));//文件大小,在文件超過2G的時候,filesize()返回的結果可能不正確
3. 輸出文件之file_get_contents()方法
file_get_contents()把文件內容讀取到字符串,也就是要把文件讀到內存中,再輸出內容
$str = file_get_contents($file); echo $str;
這種方式,只要文件稍微一大,就會超過內存限制
4. 輸出文件之file()方法
與file_get_contents()差不多,只不過是file()會把內容按行讀取到數組中,也是需要占用內存
$f = file($file); while(list($line, $cnt) = each($f)) { echo $cnt; }
文件大的時候也會超出內存限制
5. 輸出文件之readfile()方法
readfile()方法:讀入一個文件并寫入到輸出緩沖
這種方式可以直接輸出到緩沖,不會整個文件占用內存
前提要先清空緩沖,先要讓用戶看到下載文件的對話框
while (ob_get_level()) ob_end_clean(); //設置完header以后 ob_clean(); flush(); //清空緩沖區 readfile($file);
這種方法可以輸出大文件,讀取單個文件不會超出內存限制,但下面的情況除外。
readfile()在多人讀取文件的時候同樣會造成PHP內存耗盡:http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory
PHP has to read the file and it writes to the output buffer. So, for 300Mb file, no matter what the implementation you wrote (by many small segments, or by 1 big chunk) PHP has to read through 300Mb of file eventually.
If multiple user has to download the file, there will be a problem. (In one server, hosting providers will limit memory given to each hosting user. With such limited memory, using buffer is not going to be a good idea. )
I think using the direct link to download a file is a much better approach for big files.
大意:PHP需要讀文件,再輸出到緩沖。對于一個300M的文件,PHP最終還是要讀300M內存。因此在多個用戶同時下載的時候,緩沖也會耗盡內存。(不對還請指正)
例如100個用戶在下載,就需要100*buffer_size大小的內存
6. 輸出文件之fopen()方法
set_time_limit(0); $file = @fopen($file_path,"rb"); while(!feof($file)) { print(@fread($file, 1024*8)); ob_flush(); flush(); }
fopen()可以讀入大文件,每次可以指定讀取一部分的內容。在操作大文件的時候也很有用
7. 總結
利用PHP下載文件時,應該要注重場景。如果本身只是幾個小文件被下載,那么使用PHP下載比較好;但是如果PHP要承受大量下載請求,這時下載文件就不該交給PHP做。
對于Apache,有mod_xsendfile可以幫助完成下載任務,更簡單也更快速
以上是php是如何下載文件的的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。