0

ユーザーがpdfファイルをアップロード、読み取り、ダウンロードできるWebサイトを作成しています。アップロードは順調に進んでおり、PDF ファイルをオンラインで読むことができ、Adobe Reader プラグインを使用してダウンロードすることもできます。しかし、私が書いたダウンロードコードは私に苦労を与えています。ファイルをダウンロードしますが、Adobe Reader でファイルが開きません。「サポートされているファイルの種類ではないか、ファイルが破損しているため、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前にしないでください。header

取り除くだけ

echo "<br>$fullPath<br>";
于 2012-07-16T07:15:35.227 に答える
1

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

こ、こいつはやめろ。

于 2012-07-16T07:13:55.180 に答える
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、PDFのダウンロードには必要ないため、Content-lenghtとCache-controlをデフォルトの場合に移動しました。また、ファイル名が.のファイルを提供するように変更しました$name$name与えられた範囲外で定義されている場合は、逆になるはずです。

スクリプトが失敗した場合は、pdfファイルへのパスが間違っている可能性があります。上記のコードの前にこのコードを配置してみてください

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