現代瀏覽器默認直接顯示 .txt 文本內容,若需觸發「另存為」下載對話框,需通過 HTTP Header 指示瀏覽器作為附件處理。
<?php
$filename = '/path/to/' . $_GET['file'] . '.txt'; // 實際文件路徑(注意防目錄遍歷)
// 1. 聲明為強制下載類型
header('Content-Type: application/force-download');
// 或通用二進制流:header('Content-Type: application/octet-stream');
// 2. 指定下載文件名(僅文件名,不可含路徑)
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
// 3. 輸出文件流
readfile($filename);
exit;
Content-Type: application/force-download 告知瀏覽器「這不是可預覽文檔」。Content-Disposition: attachment 觸發下載行為;filename 參數決定彈出對話框顯示的默認保存名。readfile() 直接將文件流輸出到輸出緩衝區,適合大文件(不佔用 PHP 內存)。$_GET['file'] 嚴格過濾(如 basename()、白名單),防止 ../../etc/passwd 類路徑遍歷攻擊。$file = fopen($filename, 'rb');
$size = filesize($filename);
header('Accept-Ranges: bytes');
header('Content-Length: ' . $size);
header('Content-Range: bytes 0-' . ($size-1) . '/' . $size);
// 處理 $_SERVER['HTTP_RANGE'] 實現部分內容輸出(206 Partial Content)...
幾行 Header 代碼,徹底解決「點擊下載卻變預覽」的用戶體驗痛點。