通过我的网络服务器提供.docx文件在打开时已损坏

时间:2012-08-21 20:13:54

标签: php mime-types

我虽然在这里找到了答案: 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);
}

5 个答案:

答案 0 :(得分:3)

我的解决方案是添加

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

感谢大家的帮助

答案 1 :(得分: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文件等。

答案 2 :(得分:1)

我花了一段时间看看为什么我的DOCX文件被破坏并偶然发现了......但我也在其他地方找到了答案......

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

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

调整我的代码:

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

现在提供DOCX(我已将内容类型设置为" application / vnd.openxmlformats-officedocument.wordprocessingml.document")按预期提供,我不需要"修复&#34 ;像其他人一样的文件报道......(我也发现修复工作)

答案 3 :(得分: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;

我希望它有所帮助:)

答案 4 :(得分:-2)

我遇到了同样的问题。

原因是,我的 php-file 中的某个地方被隐藏了。

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

  1. 添加" //"在headerreadfile-statements
  2. 前面
  3. echo "test";
  4. 之后写下readfile-statement.
  5. 然后查看HTML源代码,如果前面有空格 " 测试"。