Использование оболочки zip:// для архива с одним файлом, имя которого неизвестно

PHP позволяет читать файлы ZIP на лету с zip:// обертка:

$fp = fopen ('zip://archive.zip#dir/file.txt', 'rb');

Все хорошо, когда вы знаете имя сжатого файла. Это не мой случай: мое приложение должно иметь дело с ZIP-архивами, содержащими один файл, имя которого неизвестно до открытия архива.

Есть ли возможность указать оболочке открыть первый файл в архиве без имени файла?

Я знаю, что могу использовать ZipArchive или Zip Functions, я просто хотел бы сделать это простым и использовать потоковую обертку, если это возможно.

1 ответ

Решение

Я нашел ответ на свой вопрос после того, как покопался в исходном коде обертки.

В настоящее время нет способа открыть архив с помощью оболочки без указания имени файла.


Решение включает использование как оболочки, так и ZipArchive:

$path = '/path/to/archive.zip';

$zip = new \ZipArchive();

if ($zip->open($path) === true) {
    if ($zip->numFiles === 1) {
        $compressedFileName = $zip->statIndex(0)['name'];
        $zipPath = 'zip://' . $path . '#' . $compressedFileName;

        $fp = fopen($zipPath, 'rb');
        // ...
    }
}
Другие вопросы по тегам