1

我虽然在这里找到了答案: Serving .docx files through Php 但是当我尝试通过 php 下载和打开 docx 服务器时,我仍然收到文件损坏的错误 也许你可以看到我的代码有问题。.doc 工作正常,失败的是 docx。

$parts = pathinfo($doc);
$docFile = $userDocRoot.$doc;
if ( !file_exists($docFile) ){
    throw new Exception("Can not find ".$parts ['basename']." on server");
}
if ( $parts['extension'] == 'docx' ){
    header('Content-type: application/vnd.openxmlformats- officedocument.wordprocessingml.document');
    header('Content-Disposition: attachment; filename="'.$parts['basename'].'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    ob_clean();
    flush();
    readfile($docFile);
}else{
   header('Content-type: application/msword');
   header('Content-Disposition: attachment; filename="'.$parts['basename'].'"');
   readfile($docFile);
}
4

5 回答 5

3

我的解决方案是添加

 $fsize = filesize($docFile);
 header("Content-Length: ".$fsize);

感谢大家的帮助

于 2012-08-21T20:44:03.320 回答
2

您的代码中有一些额外的空格会导致它失败。

尝试使用此代码:

$parts = pathinfo($doc);
$docFile = $userDocRoot . $doc;
if(!file_exists($docFile)){
    throw new Exception('Can not find ' . $parts['basename'] . ' on server');
}
if($parts['extension'] == 'docx') {
    header('Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
    header('Content-Disposition: attachment; filename="' . $parts['basename'] . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    ob_clean();
    flush();
    readfile($docFile);
} else {
    header('Content-type: application/msword');
    header('Content-Disposition: attachment; filename="' . $parts['basename'] . '"');
    readfile($docFile);
}

如果还是不行,试着注释掉headerreadfile行,然后你会看到是否有任何错误。

另外,我建议您根据白名单检查文件名,这样人们就无法下载带有密码的 PHP 文件等。

于 2012-08-21T20:23:25.543 回答
1

我刚刚花了一段时间研究为什么我的 DOCX 文件被损坏并偶然发现了这个……但我也在其他地方找到了答案……

$fsize = filesize($docFile);
header("Content-Length: ".$fsize);

这给了我寻找的工具......关键是filesize()需要文件的基本名称才能获得准确的文件大小!

调整我的代码:

header("Content-Length: ".filesize(basename($file)));

这现在按预期提供 DOCX(我已将 Content-type 设置为“application/vnd.openxmlformats-officedocument.wordprocessingml.document”),并且我不必像其他人报告的那样“修复”文档......(我也发现修复工作)

于 2012-11-08T15:44:55.847 回答
0

这是一个对我有用的代码(经过大约 5 个小时的混乱):

           // headers to send your file
           header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
           header("Content-Length: " . filesize($original_file));
           header('Content-Disposition: attachment; filename="' . $new_filename . '"');
           ob_clean();
           flush();
           readfile($original_file);
           exit;

我希望它有帮助:)

于 2017-02-17T12:47:50.367 回答
-2

我遇到过同样的问题。

原因是,在我的php 文件中某处隐藏了两个空格。

删除它们解决了这个问题。

  1. 在和//前面加“ ”headerreadfile-statements
  2. echo "test";在后面readfile-statement.
  3. 然后查看 HTML 源代码,如果“ test ”前面有空格。
于 2017-02-08T14:58:41.590 回答