php zip_entry_read проблема - PullRequest
       1

php zip_entry_read проблема

1 голос
/ 11 июля 2011

Я пытаюсь создать скрипт PHP, который получает и извлекает ZIP-файл.Первое, что я делаю, когда получаю файл, это пытаюсь извлечь файлы изнутри, чтобы убедиться, что все в порядке, и структура папок в zip такая, как должна.Если все идет хорошо, скрипт запускается и извлекает файлы.Проблема здесь.Кажется, что если я вызову zip_entry_read() один раз для zip-записи, я получу контент, но если я вызову его снова для той же ссылки на zip-запись, он ничего не вернет.Метаданные все еще там.zip_entry_name(), размер и все, что возвращает правильные данные, но не содержимое. Почему?

Вот и пример.

$target = zip_open("file.zip");
while (false !== ($entry = zip_read($target)) {
   // ... some code here
   $name = zip_entry_name($entry); // returns filename.txt
   $filesize = intval(zip_entry_filesize($entry)); // returns the filesize
   $data = zip_entry_read($entry, $filesize); // returns the content of the file

   $name = zip_entry_name($entry); // returns the same filename.txt
   $filesize = intval(zip_entry_filesize($entry)); // returns the same filesize
   $data = zip_entry_read($entry, $filesize); // ---> returns NOTHING <---
   // .. some more code here
}

Спасибо.

1 Ответ

1 голос
/ 11 июля 2011

Я провел быстрый тест, и предложенное решение (повторное закрытие и открытие записи), похоже, не сработало. Второе выполнение все еще возвращает пустую строку. В любом случае, поскольку функция zip_entry_read возвращает простую строку, я просто скопировал бы ее в другую переменную, если это не проблема.

[ОБНОВЛЕНО] Что ж, если копирование значения не является опцией, вы можете попробовать OO-версию класса ZipArchive (это объектно-ориентированная версия библиотеки zip). Нечто подобное приведенному ниже коду работает и возвращает два раза желаемую запись zip. Может быть, вы можете адаптировать его к вашим потребностям.

target = new ZipArchive();
$target->open("file.zip");

for($i = 0; $i < $target->numFiles; $i++)
{
    $stat = $target->statIndex($i);
    print_r($stat);
    $data = $target->getFromIndex($i);
    print_r($data);
    echo "<br />Control<br />"; 
    $data = $target->getFromIndex($i);
    print_r($data);
    echo "<br />Control<br />"; 

}
...