當前位置: 首頁> 最新文章列表> 下載文件時使用Content-Disposition 設置下載文件名

下載文件時使用Content-Disposition 設置下載文件名

M66 2025-05-28

在很多網站開發中,用戶可能需要下載文件。使用PHP 提供的header函數,可以方便地設置HTTP 響應頭,控製文件的下載行為。在這個教程中,我們將介紹如何使用PHP 的header函數設置Content-Disposition來指定下載文件的文件名。

1. 什麼是Content-Disposition

Content-Disposition是一個HTTP 頭,它告知瀏覽器如何處理文件。最常見的用法是在瀏覽器中啟動文件下載,並為下載的文件指定一個文件名。它通常與Content-Type一起使用,後者告訴瀏覽器如何解釋文件的內容類型。

2. 如何使用header函數設置Content-Disposition

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 "文件不存在!";
}
?>

3. 代碼說明

  • 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); :此函數會讀取文件並將內容髮送到瀏覽器,從而開始文件下載。

4. 如何使用動態生成的文件名?

有時候,我們可能希望文件名是動態生成的,而不僅僅是一個固定的字符串。在這種情況下,可以通過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 ),每次下載時文件名都會不同。

5. 如何處理URL 下載?

有時候,我們需要通過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

6. 注意事項

  • 在發送任何header之前,確保沒有任何HTML 輸出。因為HTTP 頭必須在任何內容輸出之前發送。

  • 如果文件很大,考慮使用流式讀取文件內容,而不是將整個文件加載到內存中。

總結

通過PHP 的header函數,我們可以很容易地控製文件的下載行為,包括設置文件下載時的文件名。在實際開發中,這種功能非常常見,尤其是在文件管理系統、報表生成等應用中。