Я пытаюсь собрать решение для потоковой передачи zip с помощью команды Unix zip и функции PHP passthru, но я столкнулся с загадкой.
Сценарий выглядит примерно так:
<?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 ("catstuff.zip ") Это отлично сработало с BOMArchiveHelper.
Таким образом, проблема, похоже, лежит где-то в процессе, где функция passthru берет двоичные данные, сгенерированные на лету командой zip, и передает их в браузер.
Я пытался исключить все источники, где могли быть сгенерированы дополнительные байты (установка команды zip в тишину и т. Д.), Но добавленные данные все еще остаются.Бинарная разность потокового почтового индекса и предварительно сгенерированного почтового индекса показывает, что дополнительные данные разбросаны по всему почтовому индексу, а не только в конце или в начале.
Кто-либо имеет подсказку, или видел эту проблему раньше ирешил, что это невозможно решить?
NB. Поскольку кто-то еще уже сталкивался и очень хорошо описал эту проблему передо мной без какого-либо ответа, я просто скопировал / вставил его сообщение сюда и убедился, что все его тесты действительно провалились, и ни один из моих не прошел...
Видимо, единственный способ заставить это работать - попросить людей использовать распаковку или суффикс-экспандер ...