我的php下载代码有问题

时间:2012-07-16 07:11:15

标签: php download adobe-reader

我正在创建一个网站,用户可以上传,阅读和下载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;

有人可以帮助我吗?

3 个答案:

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