0

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

有人可以帮我解决吗?

4

3 回答 3

1

echo "<br>$fullPath<br>";

这个,摆脱这个。

于 2012-07-16T07:13:55.180 回答
1

不要echoheader发送内容之前。

删除它

echo "<br>$fullPath<br>";
于 2012-07-16T07:15:35.227 回答
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 下载不需要它们。另外,我将其更改为使用 filename 提供文件$name$name我怀疑如果在给定范围之外定义它应该是相反的。

如果脚本失败,您可能只是使用了错误的 pdf 文件路径。尝试将此代码放在上面的代码之前

echo 'The file "' . $fullPath . '" ' . (is_file($fullPath) ? 'exists' : 'doesn\'t exist');
于 2012-07-16T07:49:41.733 回答