迫使文件下载msword失败

时间:2012-11-07 03:36:45

标签: php http-headers ms-word download

我目前有以下内容:

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(???????????? [吨????????????????

2 个答案:

答案 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);
    }
}