Можно ли открыть загруженный zip-файл без предварительного сохранения в виде файла?

Я загружаю zip-файл с помощью zend httpClient и получаю содержимое файла, назначенное переменной как таковой:

$body = $response->getBody();

$body имеет содержимое zip-файла, его можно открыть без сохранения в виде файла с помощью http://php.net/manual/en/class.ziparchive.php или какой-то другой родной класс 5.2?

РЕДАКТИРОВАНИЕ Предложения дали несколько хороших идей о том, как это может быть выполнимым без создания временного файла, но из-за того, что мне уже нужно будет использовать прокси-адаптер, к длине создания собственного адаптера для этой цели, просто не стоит.

В итоге я использовал tmpname для создания tmp-файла (чего я хотел избежать, но все равно оказался здесь).

   if ($response->isSuccessful()){
            $tmpfile = tempnam(sys_get_temp_dir(),'Insight');
            if ($tmpfile!==false){                
                    $handle = fopen($tmpfile, "w");
                    if (fwrite($handle, $response->getBody())!==false){
                        $zip = new ZipArchive;
                        if ($zip->open($tmpfile) === TRUE) {
                            echo $zip->getFromIndex(0);
                            $zip->close();
                        } else {
                            $this->errorLog('Unable to open zip file '.$tmpfile);
                        } 

                    }else{
                        $this->errorLog('Unable to write to temporary file '.$tmpfile);
                    }
                    fclose($handle);                  
            }else{
                $this->errorLog('Unable to create temporary zip file in '.sys_get_temp_dir());
            }                          
        }else{
            $this->errorLog('Unable to download url '.$insightUrl);
        } 

person Niklas    schedule 01.06.2011    source источник
comment
ты не можешь просто использовать zip_open("http://url/to/download.zip") ?   -  person Jules Colle    schedule 01.06.2011
comment
@Jules Нужно использовать прокси, а также, возможно, придется использовать файлы cookie. Не говоря уже о том, что это, возможно, невозможно сделать по-вашему, но, безусловно, было бы проще, если бы я все еще мог использовать клиент zend http.   -  person Niklas    schedule 01.06.2011


Ответы (2)


У меня очень мало знаний о Zend Framework и абсолютно ничего о Zend_Http_Client, но возможно вы могли бы использовать обертки потока сжатия при инициализации Zend_Http_Client следующим образом:

$client = new Zend_Http_Client('zip://http://example.org/compressed_file.zip');
person Carlos Campderrós    schedule 01.06.2011
comment
Это, к сожалению, не работает. Сообщение: Схема zip не поддерживается - person Niklas; 01.06.2011
comment
Сообщение: Предоставлена ​​недопустимая схема, разрешены только буквенно-цифровые символы. - person Niklas; 01.06.2011
comment
Ну, с каждым разом все хуже. Кажется, вы можете создать пользовательский Zend_Http_Client_Adapter, назначить ему новый контекст, созданный с помощью stream_context_create, и назначить фильтр compress.zip с помощью stream_filter_append. Затем назначьте этот новый адаптер Zend_Http_Client. Но я предполагаю, что это слишком много хлопот, а также это может не сработать. - person Carlos Campderrós; 01.06.2011
comment
Создание нового адаптера, вероятно, сработает, но мне также нужно будет использовать прокси-адаптер. Начинать расширять его и писать свой собственный адаптер только ради того, чтобы избежать создания временного файла, возможно, просто не стоит усилий в этом случае. Большое спасибо за ваш вклад, особенно в отношении этих оберток потока сжатия. Впервые слышу о них. Я отредактировал свой вопрос с решением, которое я в итоге выбрал, аналогично тому, что предложил Юджин. - person Niklas; 01.06.2011
comment
Я рад, что вы узнали что-то новое :) хотя и бесполезно в этой ситуации :( - person Carlos Campderrós; 01.06.2011

Попробуйте использовать PHP-функции Zip.

person Eugene    schedule 01.06.2011
comment
zip_open() только принимает имя файла, а не строку данных или какой-либо другой ресурс. - person Ignacio Vazquez-Abrams; 01.06.2011
comment
Ну, tmpfile может и не может рассматриваться как сохраненный файл. Если это не вариант, то другого выхода я пока не вижу. - person Eugene; 01.06.2011
comment
Вы также не сможете использовать tmpfile(), так как он возвращает ресурс, а не файл? Если на самом деле необходимо создать временный файл, он должен использовать php.net/manual/en/function.tempnam.php ? - person Niklas; 01.06.2011