摘要:下載文件的方式得到文件路徑從得到文件路徑務(wù)必使用上面這種方法得到路徑,不能簡單的字符串拼接得到路徑如果輸入的是就可以訪問任何路徑設(shè)置信息描述頁面返回的結(jié)果返回內(nèi)容的類型,此處只知道是二進制流。
PHP下載文件的方式 1. 得到文件路徑
從$_GET["file"]得到文件路徑
$path_parts = pathinfo($_GET["file"]); $file_name = $path_parts["basename"]; $file_path = "/mysecretpath/" . $file_name;
務(wù)必使用上面這種方法得到路徑,不能簡單的字符串拼接得到路徑
$mypath = "/mysecretpath/" . $_GET["file"];
如果輸入的是../../,就可以訪問任何路徑
header("Content-Description: File Transfer"); //描述頁面返回的結(jié)果 header("Content-Type: application/octet-stream"); //返回內(nèi)容的類型,此處只知道是二進制流。具體返回類型可參考http://tool.oschina.net/commons header("Content-Disposition: attachment; filename=".basename($file));//可以讓瀏覽器彈出下載窗口 header("Content-Transfer-Encoding: binary");//內(nèi)容編碼方式,直接二進制,不要gzip壓縮 header("Expires: 0");//過期時間 header("Cache-Control: must-revalidate");//緩存策略,強制頁面不緩存,作用與no-cache相同,但更嚴格,強制意味更明顯 header("Pragma: public"); header("Content-Length: " . filesize($file));//文件大小,在文件超過2G的時候,filesize()返回的結(jié)果可能不正確3. 輸出文件之file_get_contents()方法
file_get_contents()把文件內(nèi)容讀取到字符串,也就是要把文件讀到內(nèi)存中,再輸出內(nèi)容
$str = file_get_contents($file); echo $str;
這種方式,只要文件稍微一大,就會超過內(nèi)存限制
4. 輸出文件之file()方法與file_get_contents()差不多,只不過是file()會把內(nèi)容按行讀取到數(shù)組中,也是需要占用內(nèi)存
$f = file($file); while(list($line, $cnt) = each($f)) { echo $cnt; }
文件大的時候也會超出內(nèi)存限制
5. 輸出文件之readfile()方法readfile()方法:讀入一個文件并寫入到輸出緩沖
這種方式可以直接輸出到緩沖,不會整個文件占用內(nèi)存
前提要先清空緩沖,先要讓用戶看到下載文件的對話框
while (ob_get_level()) ob_end_clean(); //設(shè)置完header以后 ob_clean(); flush(); //清空緩沖區(qū) readfile($file);
這種方法可以輸出大文件,讀取單個文件不會超出內(nèi)存限制,但下面的情況除外。
readfile()在多人讀取文件的時候同樣會造成PHP內(nèi)存耗盡: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內(nèi)存。因此在多個用戶同時下載的時候,緩沖也會耗盡內(nèi)存。(不對還請指正)
例如100個用戶在下載,就需要100*buffer_size大小的內(nèi)存
6. 輸出文件之fopen()方法set_time_limit(0); $file = @fopen($file_path,"rb"); while(!feof($file)) { print(@fread($file, 1024*8)); ob_flush(); flush(); }
fopen()可以讀入大文件,每次可以指定讀取一部分的內(nèi)容。在操作大文件的時候也很有用
7. 總結(jié)利用PHP下載文件時,應(yīng)該要注重場景。如果本身只是幾個小文件被下載,那么使用PHP下載比較好;但是如果PHP要承受大量下載請求,這時下載文件就不該交給PHP做。
對于Apache,有mod_xsendfile可以幫助完成下載任務(wù),更簡單也更快速
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/21071.html
摘要:的包管理器是,用來瀏覽并搜索查看最新發(fā)行版下載。的包管理器是下一代的,使用編寫,以格式發(fā)布。二發(fā)布時間軸三安裝與使用安裝主要是安裝和這兩個包管理器,然后通過包管理器安裝其他。 PHP社區(qū)提供了幾個管理擴展和包的工具包括Pecl、Pear、Pear2和Composer。在不了解的情況下去使用這些工具必然會出現(xiàn)困惑,所以下面就簡單介紹下這幾個管理工具。 一、簡介 下面簡要介紹 Pear、P...
摘要:本文以當(dāng)前最新版本演示整個源碼安裝的流程。下載源碼包訪問官網(wǎng)的源碼包下載地址。下載源碼有兩種方式服務(wù)器端使用命令直接下載。 本文以當(dāng)前最新版本 PHP 7.3.1 演示整個源碼安裝的流程。 下載 PHP 源碼包 訪問 PHP 官網(wǎng)的源碼包下載地址 http://php.net/downloads.php。 showImg(https://segmentfault.com/img/rem...
摘要:下環(huán)境的搭建初學(xué),環(huán)境配置各種蛋疼。安裝環(huán)境點開上面的下載鏈接,進入下載頁面,建議下載線程安全版本的環(huán)境。在路徑下新建一個文件,內(nèi)容添加,然后在瀏覽器輸入,如果出現(xiàn)如圖頁面,則表示環(huán)境安裝成功。至此,本地環(huán)境的搭建就完成了。 windows下PHP環(huán)境的搭建 初學(xué)PHP,環(huán)境配置各種蛋疼。首先,我要表示對度娘搜索結(jié)果的失望,以及,墻實在是高,有三層樓那么高。如果可能的話盡可能上goog...
閱讀 2733·2021-11-23 09:51
閱讀 1720·2021-11-22 13:54
閱讀 2866·2021-11-18 10:02
閱讀 1003·2021-08-16 10:57
閱讀 3636·2021-08-03 14:03
閱讀 1935·2019-08-30 15:54
閱讀 3588·2019-08-23 14:39
閱讀 683·2019-08-23 14:26