1

ユーザーが PDF として「保存」できるようにするスクリプトがあります。これがスクリプトです。

<?php
header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
?>

エラーログが作成されており、数日で数ギグ以上になり、私が受け取ったエラーは-

[10-May-2010 12:38:50] PHP Warning:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for BYJ-Timetable.pdf in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  Cannot modify header information - headers already sent by (output started at /home/byj/public_html/pdf_server.php:10) in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15

13行目と15行目はずっと続いています...私はPHPの初心者なので、どんな助けも素晴らしいです。ありがとうみんなニック

4

4 に答える 4

4

何が起こっているのですか:

  • ファイルが見つからなかったため、filesize関数がエラーになりました
  • エラーが発生したため、出力が生成されました。
  • 出力したら、もうヘッダーを送信できません
  • より多くのヘッダーを送信しているため、より多くのエラーが発生しています

ファイルが見つからなかったため、存在しないファイルから読み取ろうとしているため、while ループは永遠にエラーになります。

ALSO:ファイルには 4 ではなく 1 つのコンテンツ タイプがあります。コンテンツ タイプの 1 つを選択して、それを使用する必要があります。

最後に: あなたのスクリプトはひどく安全ではありません。誰かが通過した場合?file=/home/apache/secret_db_passwords.txt、彼らはすぐにあなたのものにアクセスできます.

編集:PHPには、readfileあなたがやろうとしていることを正確に処理するように設計されたという関数があります。少しずつ送信するファイルを介して while ループを実行する必要はありません。実行するだけreadfile($file);で、Web サーバーが面倒なことをすべて処理してくれます

于 2010-05-11T03:31:57.110 に答える
1

いくつかのこと:

  1. 私の知る限り、ヘッダーを設定できるのは 1 回だけなので、Content-Type4 回設定しても意味がありません。

  2. コンテンツ タイプを pdf MIME タイプに設定すると役立つ場合があります。この場合は、application/pdf.

  3. Force Download私の知る限り、コンテンツタイプではありません。既に持っている を に設定すると、Content-Dispositionブラウザがダウンロードします。attachment

  4. 最後に、ファイルの PDF バージョンがない場合 (存在しないように見えます)、なぜそこからストリーミングしようとしているのでしょうか? おそらく、変数を実際のファイルに設定し、ユーザーに出力される PDF ファイル名を設定する$fileような別の変数を作成する必要があります。$filename

于 2010-05-11T03:33:26.480 に答える
1
[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12

これは、あなたが知る必要があることを教えてくれるはずです:両方fopenともfilesize、開くファイルの名前とパスを渡す必要があります。この場合、パスではなくファイル名を渡すだけなので、スクリプトが実行されている現在のディレクトリでファイルを見つけようとしています。この場合、/home.byj/public_html/

これを修正するには、PDF ファイル自体の名前だけでなく、これらの関数を開くために PDF ファイルへの相対パスまたは絶対パスを適用する必要があります。

于 2010-05-11T03:34:08.430 に答える
1

ファイルの一部をループして読み取る代わりに、http: //php.net/manual/en/function.readfile.phpを使用できますか?

于 2010-05-11T03:36:38.723 に答える