Коррумпированное извлечение с ZipArchive в PHP - PullRequest
0 голосов
/ 09 марта 2020

У меня есть PHP скрипт, который должен разархивировать некоторые загрузки. Загружаемые файлы представляют собой упакованные папки, в основном zip-файлы с пользовательским расширением.

У меня проблемы с некоторыми zip-файлами, упакованными на одной машине, но не с той же папкой, упакованной на другой машине. В обоих случаях сжатие выполняется с использованием одной и той же библиотеки Java.

Это ожидаемый результат, который затем PHP далее выполняется: correct extraction

Это искаженный результат, который приводит к PHP удушению: corrupted extraction

Если я смотрю на их разрешения, это то, что я вижу (01_Orig все в порядке, 02_Modif поврежден): permissions

Если я посмотрю на два пакета с unzip -l (первый в порядке, второй поврежден): unzip -l

И это моя PHP функция (которая одинакова в обоих случаях):

$uploads = "uploads_dir/";
$dir = new DirectoryIterator("uploads_dir/");

foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        $filename = $fileinfo->getFilename();
        $zip = new ZipArchive;
        $res = $zip->open($uploads . $fileinfo);
        if ($res === TRUE) {
            $zip->extractTo($uploads . $filename . "_extracted");
            $zip->close();
        } else {
            echo "Unable to unzip";
        }
    }
}

Обе загрузки выглядят хорошо, когда я вручную распаковываю или открываю их с помощью 7zip в моей машине Windows.

Если я создаю два шестнадцатеричных дампа обоих zip-файлов и сравниваю их, вот что я получаю: https://gist.github.com/msoutopico/22a9ef647381c2e4d26313f135c526e2

Спасибо много заранее за любые советы.

ОБНОВЛЕНИЕ:

В случае необходимости, почтовые файлы создаются (сохраняются) на сервере linux, и на обеих машинах где это done (тот, который работает, и тот, который повредил пакет), запустите Windows 10.

1 Ответ

1 голос
/ 09 марта 2020

Сортировка. Версия 2 плагина была изменена для преобразования разделителей пути из \ в / в именах файлов. Теперь, несмотря на то, что версия 3 плагина была установлена ​​на обеих машинах, на неисправной машине была также более старая (версия 1, предшествующая этой настройке), которая использовалась вместо версии 3. Просто удаление дубликата версии 1 решило проблему. @pmqs был прав. Спасибо всем, кто помог мне быстро решить эту проблему!

...