Использование опции `sink` в Guzzle для загрузки файла результатов в пустой файл. Почему так? И как это исправить? - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно скачать файл с помощью Guzzle.В настоящее время я использую версию 6.3.3.

Я передаю опцию sink на мой запрос, но хотя API я запрашиваю ответы "200 OK" с некоторым теломсодержимое файла назначения всегда пусто.

Вот код, который у меня пока есть:

// sidenote:
// $this->importFile is the absolute path to the file the contents have to be downloaded to
// $this->api is a GuzzleHttp\Client, base URL has been set previously
// $uri is the API endpoint's URI I am requesting (like "get/data")
// $this->getQueryParams() returns an array with a few needed parameters

$downloadDestination = fopen($this->importFile, 'w');

$response = $this->api->get($uri, [
    'query' => $this->getQueryParams(),
    'sink' => $downloadDestination,
]);

var_dump(file_get_contents($this->importFile));
var_dump($response->getBody()->getContents());
die;

Кстати, я называю это в контексте приложения Symfony (3.4)в команде (bin/console blah:custom-command).Приведенный выше фрагмент кода является частью одного из моих классов обслуживания.

Это приводит к недавно созданному, но пустому файлу и следующему выводу в моем терминале:

string(0) ""
string(2065) "{"id":"123", … }"
# the latter one is actually a large JSON string, I just shortened it here

У кого-нибудь есть подсказка?что я делаю не так?Это на самом деле не ракетостроение.Тем более, что я запутался сейчас, когда файл назначения для моей загрузки создан, но его содержимое не будет записано ...

Отсутствует ли какая-либо конфигурация для Guzzle или что-то в этом роде?

1 Ответ

0 голосов
/ 13 ноября 2018

Черт возьми!Это абсолютно моя вина.Я должен был также опубликовать инициализацию Guzzle Client.Тогда я мог бы определить свою ошибку чуть раньше…

$this->api = new Client([
    'base_uri' => $apiBaseUrl,
    'stream' => true,
]);

До того, как я добавил опцию sink (чтобы загрузить тело ответа в виде файла), мой класс обслуживания должен был обрабатывать ответ построчно(потому что API, с которым я работаю, отвечает данными размером до 1 ГБ).Поэтому я предварительно добавил также параметр stream.Этот конфликтует с sink.

Итак, мое решение состоит в том, чтобы просто удалить stream параметр из инициализации клиента.- И вуаля.Это работает.

...