在 php 中强制下载文件,核心是设置 content-type 为 application/octet-stream,并配合 content-disposition 响应头指定文件名。这样做可以绕过浏览器的 mime 类型检测,强制触发“另存为”对话框。

Content-Type 设为 text/html 会发生什么
如果将 Content-Type 设置为 text/html,浏览器会尝试直接渲染内容而不是下载。对于非 HTML 文件(如 PDF 或图片),这通常会导致乱码显示或空白页,因为浏览器无法解析二进制数据。

<?php $file = 'example.pdf';
header('Content-Type: text/html');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
?>
Content-Disposition 参数 inline 的效果
当 Content-Disposition 设置为 inline 时,浏览器会尝试在当前页面内打开文件。如果浏览器支持该 MIME 类型(如 PDF、图片),它会直接显示;如果不支持,则可能提示下载。这与 attachment 的强制下载行为不同。

<?php $file = 'image.png';
header('Content-Type: image/png');
header('Content-Disposition: inline; filename="' . basename($file) . '"');
readfile($file);
?>
如何确保中文文件名正确下载
在处理包含中文的文件名时,直接使用 basename() 可能导致编码问题。建议使用 urlencode() 对文件名进行编码,或者使用 RFC 5987 标准的 filename*=UTF-8''... 格式,以确保跨浏览器兼容性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











