本地檔案下載
$file_name = "info_check.exe";
$file_dir = "/public/www/download/";
if (!file_exists($file_dir . $file_name)) {
echo "檔案不存在";
exit;
}
$file = fopen($file_dir . $file_name, "r");
// 輸出 HTTP Header
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: " . filesize($file_dir . $file_name));
header("Content-Disposition: attachment; filename=" . $file_name);
// 輸出檔案內容
echo fread($file, filesize($file_dir . $file_name));
fclose($file);
exit;
遠端 URL(HTTP/FTP)下載
$file_name = "info_check.exe";
$file_dir = "https://www.easycn.net/";
$file = @fopen($file_dir . $file_name, "r");
if (!$file) {
echo "檔案不存在";
} else {
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . $file_name);
while (!feof($file)) {
echo fread($file, 50000); // 分塊輸出,避免記憶體溢位
}
fclose($file);
}
關鍵差異
- 本地檔案可用
filesize() 取得大小,設定 Accept-Length 支援斷點續傳
- 遠端串流無法預知大小,採用分塊讀取輸出
- 皆以
Content-Disposition: attachment 強制瀏覽器下載而非開啟