PHP на лету ZIP загружается как пустой - PullRequest
1 голос
/ 12 декабря 2011

Кажется, я успешно создаю zip-архив «на лету» (filesize и file_exists оба возвращают ожидаемые значения), но когда я пытаюсь фактически загрузить его, я получаю пустой 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 МБ. Есть мысли о том, в чем может быть проблема? </p>

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

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

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

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

Связанные вопросы SO:

0 голосов
/ 12 декабря 2011

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

...