當前位置: 首頁> 最新文章列表> PHP 中如何使用fpassthru 實現文件流傳輸

PHP 中如何使用fpassthru 實現文件流傳輸

gitbox 2025-05-28

在PHP 中, fpassthru函數是一個非常實用的文件流傳輸工具,尤其適用於直接向客戶端輸出文件內容,比如圖片、視頻、下載文件等。它的最大優勢是可以高效地將文件內容傳輸給瀏覽器,而不需要將整個文件讀入內存,從而節省資源,避免內存溢出的問題。

本文將詳細介紹如何使用fpassthru函數實現文件流傳輸,並結合一個完整的示例代碼,幫助你快速上手。


什麼是fpassthru?

fpassthru是PHP 文件操作中的一個函數,功能是從當前文件指針位置一直輸出到文件結束。它常與fopen配合使用,打開文件後,將文件內容直接輸出到瀏覽器。

函數原型:

 int fpassthru ( resource $handle )
  • $handle是由fopen()返回的文件指針資源。

  • 返回值是輸出的字節數。


使用場景

  • 文件下載接口

  • 圖片或視頻流的輸出

  • 任何需要將文件原封不動發送到客戶端的場景


使用fpassthru 實現文件流傳輸的步驟

  1. 打開文件<br> 使用fopen()以二進制模式打開文件,保證傳輸的文件不受字符編碼影響

  2. 發送正確的HTTP 頭<br> 根據文件類型發送相應的Content-Typ e 、 Content-Length和Content-Dispositio n (如果是下載文件)

  3. 調用fpassthru 輸出文件流<br> 將文件內容直接輸出到客戶端

  4. 關閉文件資源<br> 釋放資源,避免資源洩漏


完整示例代碼

<?php
// 文件路徑
$filePath = '/path/to/your/file.zip';

// 判斷文件是否存在
if (!file_exists($filePath)) {
    header("HTTP/1.1 404 Not Found");
    exit("File not found.");
}

// 打開文件
$fp = fopen($filePath, 'rb');
if (!$fp) {
    header("HTTP/1.1 500 Internal Server Error");
    exit("Failed to open file.");
}

// 獲取文件大小
$fileSize = filesize($filePath);

// 設定 HTTP 頭,告訴瀏覽器文件類型和大小
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . $fileSize);
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Expires: 0');

// 使用 fpassthru 輸出文件內容
fpassthru($fp);

// 關閉文件資源
fclose($fp);
exit;
?>

代碼說明

  • fopen($filePath, 'rb') :以二進制只讀模式打開文件。

  • 設置的HTTP 頭確保瀏覽器識別文件類型和大小, Content-Disposition指定了下載文件的默認名稱。

  • fpassthru($fp)會直接將文件指針當前位置到文件末尾的所有數據輸出。

  • 關閉文件句柄後退出,確保不會輸出多餘內容。


注意事項

  • 如果文件較大, fpassthru是高效的傳輸方式,因為它不會將文件全部讀入內存。

  • 傳輸之前務必發送合適的HTTP 頭,確保瀏覽器正確處理文件。

  • 若文件路徑來自用戶輸入,務必做好安全校驗,防止路徑穿越等安全風險。

  • 對於支持斷點續傳的下載需求,需要額外處理HTTP_RANGE頭,本文不做詳細講解。


小結

通過以上步驟,你可以輕鬆使用PHP 的fpassthru函數實現高效的文件流傳輸。它適合各類文件下載和流媒體輸出場景,且代碼簡潔、性能優秀。

如果你需要搭建文件下載接口或者媒體流服務,不妨試試fpassthru ,它會讓你的代碼更簡潔高效。