當前位置: 首頁> 最新文章列表> 實現下載按鈕:前端觸發請求,後端用header() 推送文件

實現下載按鈕:前端觸發請求,後端用header() 推送文件

M66 2025-06-05

文件下載是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 對象創建文件下載鏈接,隨後自動觸發下載。

後端如何使用header() 推送文件?

在PHP 中, header()函數用於發送原始HTTP 頭信息。通過header()函數,我們可以告知瀏覽器下載某個文件。具體操作如下:

  1. 首先,確保你已經驗證了文件的存在。

  2. 設置適當的Content-Type 和Content-Disposition 頭部,以告訴瀏覽器如何處理文件。

  3. 使用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 應用添加文件下載功能。