我正在创建一个网站,用户可以上传,阅读和下载pdf文件。上传工作正常,他们可以在线阅读pdf文件,也可以使用adobe reader插件下载。但是我写的下载代码让我很难过。它下载文件,但文件未在adobe阅读器中打开。它出现错误“Adobe Reader无法打开文件,因为它不是受支持的文件类型,或者因为文件已损坏”。
这是我的代码:
if(is_file($fullPath)) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts['extension']);
switch($ext) {
case 'pdf':
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $fullPath. '"');
break;
default:
header('Content-type: application/octet-stream');
}
header('Content-length: $fsize');
header('Cache-control: private'); //use this to open files directly
readfile($name);
}
exit;
有人可以帮助我吗?
答案 0 :(得分:1)
echo "<br>$fullPath<br>";
这,摆脱这个。
答案 1 :(得分:1)
发送
echo
内容之前请勿header
。
删除它
echo "<br>$fullPath<br>";
答案 2 :(得分:0)
正如其他人所说,如果没有指定其他内容,则会在第一个输出发送标头,因此您的echo将触发脚本发送内容类型的标准标头,如Web服务器所指定 - 可能是html或类似它
此外,您的代码中还有其他不必要的内容,因此我建议使用以下内容:
if(is_file($fullPath)) {
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts['extension']);
switch($ext) {
case 'pdf':
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $name . '"');
break;
default:
header('Content-type: application/octet-stream');
header('Content-length: ' . filesize($fullPath));
header('Cache-control: private'); //use this to open files directly
}
readfile($fullPath);
}
exit;
最大的区别是,初始检查只检查文件是否存在并且不打开文件。只需打开文件并将其直接写入输出缓冲区即可完成输出。
我从默认情况下删除了部分Content-Disposition
标头,因为默认情况下会执行相同或更好的操作,并将Content-lenght和Cache-control移动到默认情况,因为pdf下载不需要它们。
此外,我更改了它以提供文件名为$name
的文件。我怀疑如果在给定范围之外定义$name
,它应该是另一种方式。
如果脚本失败,您可能只有错误的pdf文件路径。尝试将此代码放在上面的代码之前
echo 'The file "' . $fullPath . '" ' . (is_file($fullPath) ? 'exists' : 'doesn\'t exist');