Загрузка ZIP-файла из ответа POST в PHP

На Python я могу написать такой код:

def func(url, configuration_username, configuration_pass):
    with requests.Session() as session:
        params = {
            'configuration_username': configuration_username,
            'configuration_pass': configuration_pass,
        }
        if response.status_code == 200:
            if 'Login error' not in response.text:
                print('OK: Login success')
                downloaded_zip = zipfile.ZipFile(io.BytesIO(response.content))
                downloaded_zip.extractall()
            else:
                print('ERROR: Login error')
        else:
            print('ERROR: Received status code %d' % response.status_code)

В основном есть вход на сайт. Когда вы вводите свои учетные данные и нажимаете «Отправить», он отправляет POST-запрос с соответствующими учетными данными. Ответ представляет собой файл .ZIP, но он также отправляет источник страницы входа. В Python мне удалось заставить это работать, потому что response.content содержал данные ZIP-файла в байтах, а response.text был исходным кодом страницы. Таким образом, я могу проверить response.text на наличие ошибок на веб-странице, а затем записать байты из response.content в ZIP-архив и извлечь его. Я хочу переписать это на PHP, но также не хочу получать исходный код страницы.

<?php
ob_start();
session_start();
header("X-XSS-Protection: 0");

$configuration_username = "myusername";
$configuration_pass = "mypass";
$params = array(
    "configuration_username" => $configuration_username,
    "configuration_pass" => $configuration_pass
);
$server_url = "http://myurl.com";
$ch = curl_init($server_url);
$destination_file = "/var/www/html/filetest.zip";
$file_resource = fopen($destination_file, "w");
$curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_FILE, $file_resource);
$response = curl_exec($ch);

if ((curl_errno($ch)) or (!$response)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
fclose($file_resource);

ob_end_flush();
?>

Этот код выше записывает байты ответа в файл, но результатом являются байты ZIP в дополнение к исходному коду страницы. Есть ли решение этого?

Вы уверены, что вам это нужно: curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);? Из документации - CURLOPT_BINARYTRANSFER TRUE to return the raw output when CURLOPT_RETURNTRANSFER is used. Я думаю, что вам, возможно, не нужен этот флаг, поскольку он просто возвращает необработанный вывод. CURLOPT_FILE должен обрабатывать аспект двоичной передачи.

dgig 03.07.2018 00:09

@dgig Пропуск BINARYTRANSFER, похоже, должен повлиять на результаты, поэтому вы правы, однако мне все еще нужно разработать способ поместить в файл только данные ZIP.

Chase 03.07.2018 00:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
178
0

Другие вопросы по теме