PHP на лету ZIP загружается как пустой

Кажется, я успешно создал zip-архив «на лету» (и размер файла, и файл_существует, возвращают ожидаемые значения), но когда я пытаюсь его загрузить, я получаю пустой ZIP-файл. Как ни странно, эта ошибка возникает как с readfile, так и с fread. это мой код

$filename = $zip;
    $handle = fopen($filename, 'r');
    if ($handle === false)
    {
        die('Could not read file "' . $filename . '"');
    }

    header('Content-type: application/zip');
    header('Content-Disposition: attachment; filename="fsdownload.zip"');
    header('Cache-Control: private');
    while (!feof($handle))
    {
        echo fread($handle, 8192);
    }
    fclose($handle);

Это отлично работает для zip-файлов ‹ 10 МБ. Есть мысли в чем может быть проблема?


person hauptbenutzer    schedule 12.12.2011    source источник
comment
Что об этом говорит журнал ошибок php?   -  person Nameless    schedule 12.12.2011
comment
попробуйте fpassthru. И сколько времени занимает загрузка?   -  person Sam    schedule 12.12.2011


Ответы (2)


Чтобы не потреблять слишком много памяти, вы можете использовать ZipStream или PHPZip, который будет отправлять сжатые файлы на лету в браузер, разделенные на куски, вместо того, чтобы загружать весь контент в PHP и затем отправлять zip-файл.

Обе библиотеки являются хорошими и полезными фрагментами кода. Несколько деталей:

  • ZipStream "работает" только с памятью, но при необходимости не может быть легко перенесен на PHP 4 (использует hash_file() )
  • PHPZip записывает временные файлы на диск (занимает столько места на диске, сколько самый большой файл для добавления в zip), но при необходимости его можно легко адаптировать для PHP 4.

Связанные с этим вопросы:

person Frosty Z    schedule 12.12.2011

Проблема в лимите PHP. Проверьте ограничения памяти и времени выполнения.

person PiTheNumber    schedule 12.12.2011
comment
Это зависит от версии PHP. См. php.net/manual/de/function.fread.php#73887. - person PiTheNumber; 12.12.2011