我目前有以下内容:
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($path)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($path)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
ob_start();
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header('Content-Description: File Transfer');
header("Content-Type: octet-stream");
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header("Content-Length: ".filesize($path));
header("Content-Disposition: attachment; filename=\"".basename($path)."\"");
ob_clean();
ob_flush();
readfile($path);
exit;
上面的代码生成了正确文件名的文件下载,但有一个扭曲。
下载的文件中有一些来自下载页面的html(标题发送不正确?)然后在下载的文档中有乱码文本(例如OJQJ ^ J。??。WW8Num2z0)占用了几页。最后在.doc的末尾,我可以阅读一些英文,它似乎是.doc的正确文本,但没有格式化。
这些问题在Chrome和Mozilla中仍然存在。
非常感谢任何帮助。提前谢谢。
编辑:
我开始使用只有一行文字的.doc进行测试:“test”
可以从上载文件的目录中手动打开文件,并验证文件是否已损坏。但是,使用迄今为止推荐的任何方法下载此文件会产生几页乱码文本(真正的文件只有1行)。这个文件的实际文本是“测试”,可以在66页乱码的最后一页找到,它可以在这个大海捞针中找到:?测试?“ㅀ?ㅀ?!ㅀn”ㅀn#ミn $ミn3P(20 ???՜。モラ+,??՜。モラ+,??? Root Entry ??????????????????????????????????????????????????????? ?1Table ????????????ㄵ的SummaryInformation ????? WordDocument ????????????“$ DocumentSummaryInformation8(???????????? [吨????????????????
答案 0 :(得分:1)
请尝试摘录最后一个没有任何刷新功能的else
header("HTTP/1.1 200 OK");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".basename($path));
header("Content-Description: File Transfer");
@readfile($path);
答案 1 :(得分:1)
这些是什么?
header("Content-Type: octet-stream");
header("Content-Transfer-Encoding: binary");
将代码修剪为一个工作示例并从那里扩展它。您不需要设置状态代码,PHP会为您执行此操作。您也不需要设置Content-length。只发送此信息应该可以正常工作:
$path = 'foo.dat';
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($path)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($path)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
header("Content-Disposition: attachment; filename=\"".basename($path)."\"");
readfile($path);
}
}