PHP: проблема с использованием Passthru, чтобы поток ZIP на Mac OS X только
Вопрос
Я пытаюсь собрать решение по заказу на молнии с помощью использования Zip-команды Unix и функции PASSTHRU PHP, но я ударил заглох.
Сценарий выглядит что-то подобное:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachement; filename=myfile.zip");
passthru("zip -r -0 - /stuff/to/zip/");
exit();
?>
Команда zip работает нормально, и выходной вывод принимается браузером и сохраняется в виде файла zip. Затем ZIP можно извлечь штраф на Windows и Unix, но на Mac OS X Создание в экстракторе (BomarchiveHelper) не может извлечь файл. Использование других приложений на OS X работает нормально.
Ошибка, заданная BomarchiveHelper, такая же, она дает, если ZIP защищен паролем (не обрабатывается приложением). Я использовал какую-то программу ZIP-анализатора, и она указывала, что некоторые файлы в архиве ZIP были помечены как защищены паролем. Как я уже сказал, однако никакие другие экстракционные приложения не обращают внимания на это, очевидно.
При обнаружении на молнии я обнаружил, что тот, который генерируется файлами PHP, - это несколько байтов, превышающих один, сгенерированный непосредственно с помощью команды zip на сервере. Похоже, что процесс потока с Passthru добавляет что-то в файл, который, вероятно, вызывает проблемы с BomarchiveHelper.
Чтобы проверить это, я использовал Passthru, чтобы поток ZIP я уже создал на сервере: Passthru («Cat Parts.zip»), который работал нормально с BomarchiveHelper.
Таким образом, проблема, похоже, лежит где-то в процессе, где функция Passthru принимает двоичные данные, сгенерированные на лету командой zip и передают это в браузере.
Я пытался устранить все источники, где можно сгенерировать дополнительные байты (настройка команды zip для тихого и т. Д.), Но добавленные данные все еще остаются. Двоичная разница потоковой почтовой почки и предварительно сгенерированной ZIP показывает, что дополнительные данные разбросаны по всему ZIP, а не только в конце или на начало.
У кого-нибудь есть подсказка или видели эту проблему до и решили, что невозможно решить?
NB: Поскольку кто-то еще уже столкнулся и очень хорошо описал эту проблему до меня без какого-либо ответа, я просто скопировал / вставку его сообщение здесь и убедился, что все его тесты эффективно провалились, и ни один из моих не прошел ...
По-видимому, единственный способ получить это на работу было бы попросить людей использовать либо расстегнуть или SustSitexpander ...
Решение
Если вы используете Nginx, то посмотрите на http://wiki.nginx.org/nginxngxzip.