文件下載是Web 應用中常見的需求之一。通過PHP 的header()函數,可以實現將文件推送到瀏覽器,觸髮用戶的文件下載操作。本文將詳細介紹如何通過PHP 的header()函數實現文件下載功能,同時講解前端如何觸發請求以及後端如何使用header()函數推送文件到瀏覽器。
在前端,我們可以使用HTML 或JavaScript 來觸發文件下載請求。最簡單的方式就是通過點擊一個鏈接來觸發下載。通常,我們會使用a標籤來定義一個鏈接,並利用href指定文件的URL。
<a href="http://m66.net/download.php?file=example.txt" download>點擊下載文件</a>
在這個例子中,用戶點擊鏈接後,瀏覽器會請求download.php文件,並通過GET 請求將文件參數(如file=example.txt )傳遞給後端PHP 腳本。
另外,你也可以通過JavaScript 動態觸發文件下載,比如:
function downloadFile() {
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://m66.net/download.php?file=example.txt", true);
xhr.responseType = "blob"; // 表示返回的數據是二進製文件
xhr.onload = function() {
const blob = xhr.response;
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'example.txt'; // 設置下載的文件名
link.click(); // 觸發點擊,下載文件
};
xhr.send();
}
這段JavaScript 會通過Ajax 請求文件,並使用Blob 對象創建文件下載鏈接,隨後自動觸發下載。
在PHP 中, header()函數用於發送原始HTTP 頭信息。通過header()函數,我們可以告知瀏覽器下載某個文件。具體操作如下:
首先,確保你已經驗證了文件的存在。
設置適當的Content-Type 和Content-Disposition 頭部,以告訴瀏覽器如何處理文件。
使用readfile()或其他方法將文件內容輸出給瀏覽器。
<?php
// download.php
// 獲取文件名參數
$file = isset($_GET['file']) ? $_GET['file'] : '';
$filePath = '/path/to/files/' . $file; // 設置文件的絕對路徑
// 檢查文件是否存在
if (file_exists($filePath)) {
// 設置響應頭,告知浏览器下載文件
header('Content-Type: application/octet-stream'); // 適用於所有文件類型
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"'); // 強制下載並指定文件名
header('Content-Length: ' . filesize($filePath)); // 文件大小
header('Cache-Control: no-cache, no-store, must-revalidate'); // 禁用緩存
header('Pragma: no-cache');
header('Expires: 0');
// 輸出文件內容
readfile($filePath);
exit;
} else {
echo '文件不存在或路徑錯誤!';
}
?>
在這個PHP 示例中,我們首先獲取URL 中傳遞的文件參數(例如example.txt ),然後通過文件路徑查找文件。如果文件存在,我們通過header()設置文件的下載類型和其他信息,接著使用readfile()輸出文件內容,最終實現文件的下載。
header('Content-Type: application/octet-stream') :設置文件類型為二進制流。對於所有類型的文件,使用application/octet-stream作為通用MIME 類型。
header('Content-Disposition: attachment; filename="filename"') :設置瀏覽器在收到該響應時將文件作為附件下載,並給文件指定一個文件名。文件名可以通過basename()獲取文件的基本名稱。
header('Content-Length: ' . filesize($filePath)) :設置文件的大小。這對於大文件尤其重要,瀏覽器可以基於此信息估算下載進度。
readfile($filePath) :該函數會讀取文件並直接輸出到瀏覽器。
exit; :在輸出文件內容後,調用exit;終止腳本執行,避免多餘的輸出或響應。
通過使用PHP 的header()函數,結合合適的HTTP 頭設置,可以實現文件下載功能。在前端,用戶通過點擊鏈接或觸發Ajax 請求來請求文件;在後端,PHP 通過header()函數設置正確的響應頭,之後將文件內容推送到瀏覽器進行下載。通過這種方式,你可以方便地為Web 應用添加文件下載功能。