PHP создает огромный файл ошибок на моем сервере feof () fread () - PullRequest
1 голос
/ 11 мая 2010

У меня есть скрипт, который позволяет пользователям «сохранять как» 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, так что любая помощь великолепна. Спасибо, парни Nik

Ответы [ 4 ]

4 голосов
/ 11 мая 2010

Что происходит, это:

  • Ваш файл не найден, поэтому функция filesize вышла из строя
  • Из-за ошибки произошла ошибка.
  • После вывода вы НЕ МОЖЕТЕ больше отправлять заголовки
  • Поскольку вы отправляете больше заголовков, вы получаете больше ошибок

Поскольку ваш файл не был найден, ваш цикл while будет ошибаться вечно, потому что вы пытаетесь читать из файла, который не существует.

ТАКЖЕ: Файл имеет ОДИН тип контента, а не 4. Вам нужно выбрать один из типов контента и использовать тот, вы не можете передать их все.

И наконец: ваш сценарий ужасно небезопасен . Если кто-то передаст ?file=/home/apache/secret_db_passwords.txt, он сразу же получит доступ к вашим вещам.

Редактировать: PHP имеет функцию под названием readfile, которая предназначена для того, чтобы обрабатывать именно то, что вы пытаетесь сделать. Вам не нужно запускать цикл while для отправки файла по крупицам. Просто сделайте readfile($file); и веб-сервер обработает всю эту ерунду для вас

1 голос
/ 11 мая 2010

Вместо зацикливания и чтения фрагментов файла вы можете использовать: http://php.net/manual/en/function.readfile.php?

1 голос
/ 11 мая 2010
[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.

1 голос
/ 11 мая 2010

Пара вещей:

  1. Вы можете установить заголовок только один раз, насколько я знаю, поэтому установка Content-Type четыре раза не имеет смысла.

  2. Это может помочь, если вы установите тип содержимого в тип pime mime, в этом случае я бы выбрал application/pdf.

  3. Force Download это не тип контента, насколько я знаю. Браузер загрузится, если вы установите Content-Disposition на attachment, который у вас уже есть.

  4. Наконец, если не существует PDF-версии файла (которая выглядит так, как будто ее нет), почему вы пытаетесь транслировать с нее? Возможно, вы захотите установить переменную $file для фактического файла и создать другую переменную, например $filename, для установки имени файла PDF, которое выводится пользователю.

...