我虽然在这里找到了答案: 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);
}
答案 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);
}
如果仍然无效,请尝试注释掉header
和readfile
行,然后您会看到是否有任何错误。
另外,我建议您根据白名单检查文件名,以便人们无法下载包含密码的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 中的某个地方被隐藏了。
删除它们解决了这个问题。
//
"在header
和readfile-statements
echo "test";
readfile-statement.