#php #zend-framework #zip
#php #zend-framework #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);
}
Комментарии:
1. вы не можете просто использовать
zip_open("http://url/to/download.zip")
?2. @Jules Необходимо использовать прокси, и, возможно, также придется использовать cookies. Не говорю, что это, возможно, невозможно сделать вашим способом, но, безусловно, было бы проще, если бы я все еще мог использовать http-клиент zend.
Ответ №1:
У меня очень мало знаний о Zend Framework и абсолютно ничего о Zend_Http_Client, но, может быть, вы могли бы использовать обертки потока сжатия при инициализации Zend_Http_Client
вот так:
$client = new Zend_Http_Client('zip://http://example.org/compressed_file.zip');
Комментарии:
1. К сожалению, это не работает. Сообщение: Схема «zip» не поддерживается
2. Сообщение: Предоставлена недопустимая схема, разрешены только буквенно-цифровые символы
3. Что ж, с каждым разом становится все хуже. Кажется, вы можете создать пользовательский Zend_Http_Client_Adapter, назначить ему новый контекст, созданный с помощью stream_context_create, и назначить фильтр compress.zip с помощью stream_filter_append. Затем назначьте этот новый адаптер Zend_Http_Client. Но я думаю, что это слишком хлопотно, а также это может не сработать.
4. Создание нового адаптера, вероятно, сработало бы, но мне также нужно будет использовать прокси-адаптер. Начинать расширять на нем и писать свой собственный адаптер, просто ради того, чтобы избежать создания временного файла, возможно, просто не стоит усилий в этом случае. Однако большое спасибо за ваш вклад, особенно в тех оболочках потока сжатия. Впервые я о них услышал. Я отредактировал свой вопрос с помощью решения, к которому в итоге пришел, аналогичного тому, что предложил Юджин.
5. Я рад, что вы узнали что-то новое 🙂 хотя и не полезное в данной ситуации : (
Ответ №2:
Попробуйте использовать Zip-функции PHP.
Комментарии:
1.
zip_open()
принимает только имя файла, а не строку данных или какой-либо другой ресурс.2. Что ж, tmpfile может рассматриваться как сохраненный файл, а может и нет. Если это невозможно, то на данный момент я не вижу другого способа.
3. Вы также не сможете использовать tmpfile(), поскольку он возвращает ресурс, а не файл? Если на самом деле потребуется создать временный файл, он должен использовать php.net/manual/en/function.tempnam.php ?