Скачать файл с Guzzle - PullRequest
       15

Скачать файл с Guzzle

0 голосов
/ 23 апреля 2020

Я пытаюсь получить вложение файла с помощью Guzzle. Файл недоступен напрямую через конечную точку, но загрузка инициируется через конечную точку и загружается в мой браузер. Могу ли я получить этот файл с помощью Guzzle?

Я успешно вошел на сайт, но в моем файле сохраняется html сайта, а не загрузка. Содержимое файла, кажется, приходит, когда я делаю запрос с клиентом покоя бессонницы, но не с Guzzle.

$client = new GuzzleHttp\Client();
$cookieJar = new \GuzzleHttp\Cookie\CookieJar();

$response = $client->post('https://test.com/login', [
    'form_params' => [
        'username' => $username,
        'password' => $password,
        'action' => 'login'
    ],
    'cookies' => $cookieJar
]);

$resource = fopen(__DIR__.'/../../feeds/test.xls', 'w');
$stream = GuzzleHttp\Psr7\stream_for($resource);
$response = $client->request('GET', 'https://test.com/download', ['sink' => $stream]);

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Если вы хотите выполнить шаг аутентификации, а затем шаг загрузки, вам необходимо убедиться, что файлы cookie сохраняются в обоих запросах. Прямо сейчас вы только передаете свою переменную $cookieJar первой.

Явным способом сделать это было бы добавить ее к опциям для второго запроса:

['sink' => $stream, 'cookies' => $cookieJar]

но может быть проще воспользоваться опцией в самом конструкторе клиента:

$client = new GuzzleHttp\Client(['cookies' => true);

Это означает, что каждый запрос (с этим клиентом) будет автоматически использовать общий поваренный файл ie jar, и вы не нужно беспокоиться о передаче его в каждый запрос отдельно.

0 голосов
/ 23 апреля 2020

Вы должны отправить заголовок Content-Disposition, чтобы указать, что клиент должен получить загрузку файла в ответ. В соответствии с вашим GET HTTP request, который захватывает содержимое в ресурс $stream, наконец, вы можете вывести это содержимое в браузер с помощью stream_get_contents.

<?php 

// your 3rd party end-point authentication

...

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="test.xls"'); 

$resource = fopen(__DIR__.'/../../feeds/test.xls', 'w');
$stream = GuzzleHttp\Psr7\stream_for($resource);
$response = $client->request('GET', 'https://test.com/download', ['sink' => $stream]);

echo stream_get_contents($stream);
...