Nginx是一個高性能的Web服務(wù)器和反向代理服務(wù)器,而PHP是一種腳本語言,常用于網(wǎng)站的后臺服務(wù)。在許多網(wǎng)站應(yīng)用程序中,需要支持下載功能,也就是需要用戶能夠方便地下載文件,如軟件、文檔、圖片等。此時,Nginx和PHP就可以結(jié)合起來實現(xiàn)這一功能。
一般而言,實現(xiàn)下載功能的核心就是構(gòu)造一個HTTP響應(yīng),告訴瀏覽器要下載的文件的類型、大小和名稱,以及文件的實際內(nèi)容。首先,我們可以用Nginx配置一個location,用于處理下載請求:
location /download/ {
root /www/data/files/;
}
這個location的作用是把所有通過/download/路徑請求的URL都直接映射到/www/data/files/目錄下。那么如何判斷一個請求是否是下載請求呢?可以用文件擴展名來進行判斷:if ($request_uri ~* ^/download/(.+)\.(mp3|pdf|zip|txt)$) {
add_header Content-Disposition 'attachment; filename="$1.$2"';
}
如果請求的URL路徑以/download/開頭,并且以.mp3、.pdf、.zip或.txt為擴展名,那么就把響應(yīng)的Content-Disposition頭設(shè)置為attachment,表明這是一個下載響應(yīng)。具體的文件名可以從正則表達(dá)式中提取出來。
處理完了Nginx的配置,下一步就是PHP的工作了。首先需要獲取要下載的文件的路徑和名稱:$file = '/www/data/files/'.$filename;
$basename = basename($file);
$size = filesize($file);
然后,就可以開始發(fā)送文件內(nèi)容:header('Content-Type: application/octet-stream');
header('Content-Length: '.$size);
header('Content-Disposition: attachment; filename="'.$basename.'"');
$fp = fopen($file, 'rb');
while (!feof($fp)) {
echo fread($fp, 8192);
}
fclose($fp);
這里,我們首先設(shè)置響應(yīng)的Content-Type為application/octet-stream,表示這是一個二進制流的文件。然后,設(shè)置Content-Length頭為文件的大小,以及Content-Disposition頭為attachment,文件名為$basename。最后,打開文件并逐個讀取,輸出到瀏覽器。需要注意的是,這里每次輸出8192字節(jié),以免一次讀取過多占用過多內(nèi)存。
通過這樣的方式,我們就可以實現(xiàn)簡單的文件下載功能了。需要注意的是,這種方式只適合小文件的下載,對于大文件,需要考慮分段下載以節(jié)約資源。同時,也應(yīng)當(dāng)注意安全問題,如文件夾權(quán)限的設(shè)置、惡意文件的上傳、目錄遍歷等。上一篇nginx php 整合
下一篇java引用類型和gc