在很多網站開發中,用戶可能需要下載文件。使用PHP 提供的header函數,可以方便地設置HTTP 響應頭,控製文件的下載行為。在這個教程中,我們將介紹如何使用PHP 的header函數設置Content-Disposition來指定下載文件的文件名。
Content-Disposition是一個HTTP 頭,它告知瀏覽器如何處理文件。最常見的用法是在瀏覽器中啟動文件下載,並為下載的文件指定一個文件名。它通常與Content-Type一起使用,後者告訴瀏覽器如何解釋文件的內容類型。
header函數可以用來發送原始HTTP 頭。如果我們想指定文件下載時的文件名,我們可以設置Content-Disposition頭。下面是一個簡單的例子:
<?php
// 設置文件路徑
$file = 'path/to/your/file.txt';
// 確保文件存在
if (file_exists($file)) {
// 設置正確的內容類型,告訴瀏覽器這是一個下載文件
header('Content-Type: application/octet-stream');
// 設定 Content-Disposition 頭,指定文件下載時的文件名
header('Content-Disposition: attachment; filename="downloaded_file.txt"');
// 設定文件大小
header('Content-Length: ' . filesize($file));
// 讀取並輸出文件內容
readfile($file);
exit;
} else {
echo "文件不存在!";
}
?>
header('Content-Type: application/octet-stream'); :這行代碼告訴瀏覽器下載的是二進製文件,不進行自動打開。
header('Content-Disposition: attachment ; filename="downloaded_file.txt"'); :這行代碼指定了文件的下載方式為attachment (即下載),並且給文件指定了下載後的名稱"downloaded_file.txt" 。
header('Content-Length: ' . filesize($file)); :這行代碼指定了文件的大小,有助於瀏覽器正確處理文件的下載。
readfile($file); :此函數會讀取文件並將內容髮送到瀏覽器,從而開始文件下載。
有時候,我們可能希望文件名是動態生成的,而不僅僅是一個固定的字符串。在這種情況下,可以通過PHP 變量來設置文件名。例如:
<?php
// 設置文件路徑
$file = 'path/to/your/file.txt';
// 動態生成文件名
$fileName = 'downloaded_' . date('Y-m-d_H-i-s') . '.txt';
// 確保文件存在
if (file_exists($file)) {
// 設置正確的內容類型
header('Content-Type: application/octet-stream');
// 动态設定 Content-Disposition 頭
header('Content-Disposition: attachment; filename="' . $fileName . '"');
// 設定文件大小
header('Content-Length: ' . filesize($file));
// 讀取並輸出文件內容
readfile($file);
exit;
} else {
echo "文件不存在!";
}
?>
在這個例子中,文件名將包含當前的日期和時間(如: downloaded_2025-05-04_12-30-45.txt ),每次下載時文件名都會不同。
有時候,我們需要通過URL 提供文件下載,而不僅僅是服務器上的本地文件。這時,我們也可以用header函數來設置Content-Disposition ,並將文件內容從遠程服務器下載過來。
<?php
// 設定远程文件 URL
$url = 'https://m66.net/files/sample.txt';
// 獲取文件內容
$fileContent = file_get_contents($url);
// 如果文件內容獲取成功
if ($fileContent !== false) {
// 設定文件类型
header('Content-Type: application/octet-stream');
// 設定文件下载名称
header('Content-Disposition: attachment; filename="sample_from_m66.txt"');
// 設定文件大小
header('Content-Length: ' . strlen($fileContent));
// 輸出文件內容
echo $fileContent;
exit;
} else {
echo "無法下載文件!";
}
?>
在這個例子中,我們從https://m66.net/files/sample.txt下載文件,並通過header設置下載文件的名稱為sample_from_m66.txt 。
在發送任何header之前,確保沒有任何HTML 輸出。因為HTTP 頭必須在任何內容輸出之前發送。
如果文件很大,考慮使用流式讀取文件內容,而不是將整個文件加載到內存中。
通過PHP 的header函數,我們可以很容易地控製文件的下載行為,包括設置文件下載時的文件名。在實際開發中,這種功能非常常見,尤其是在文件管理系統、報表生成等應用中。