使用php强制下载word文档(.docx)的核心做法是设置特定的http响应头并输出文件内容。你需要调用 header() 函数设置 content-type 为 application/vnd.openxmlformats-officedocument.wordprocessingml.document,设置 content-disposition 为 attachment 并指定文件名,最后通过 readfile() 读取并输出文件流。

header() 中 Content-Type 的具体值是什么
对于 .docx 格式的文件,必须使用 MIME 类型 application/vnd.openxmlformats-officedocument.wordprocessingml.document。如果使用错误的类型如 application/msword,浏览器或客户端可能无法正确识别文件格式,导致打开错误或提示损坏。这个MIME类型专门用于标识由 Microsoft Office 2007 及更高版本生成的 XML 基础文档。

<?php
$file = 'example.docx';
$filename = 'report.docx';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
Content-Disposition 如何控制文件名和下载行为
Content-Disposition 头部的 attachment 指令告诉浏览器这是一个需要下载的资源,而不是直接在页面中显示。通过在后面添加 filename= 参数,你可以自定义下载时保存的文件名。如果省略 filename,浏览器通常会使用URL中的最后一个路径段作为默认文件名。此外,处理中文文件名时需要进行 URL 编码或使用 ISO-8859-1 字符集转义,以防止乱码。
立即学习“PHP免费学习笔记(深入)”;

<?php
// 示例:处理中文文件名
$filename = "\u62a5\u544a.docx";
header('Content-Disposition: attachment; filename="' . rawurlencode($filename) . '"');
?>
预期结果:浏览器弹出下载框,建议保存文件名为“报告.docx”。如果文件不存在会返回什么错误
如果在代码中检查文件存在性的逻辑缺失,或者 readfile() 尝试读取一个不存在的文件,PHP 会触发一个警告(Warning),并且不会发送任何有效的文件内容给浏览器。此时,浏览器可能会显示空白页、下载一个空文件,或者根据服务器配置显示默认的 404 错误页面。因此,始终应在输出任何头部信息之前使用 file_exists() 进行验证,并在文件不存在时终止脚本执行。



















