Лучшие методы загрузки файлов с помощью Guzzle

Когда дело доходит до загрузки файлов с помощью PHP, Guzzle — это популярная и мощная библиотека, которая может сделать этот процесс плавным и эффективным. Guzzle предоставляет широкий спектр методов и функций, упрощающих загрузку файлов. В этой статье мы рассмотрим несколько способов загрузки файлов с помощью Guzzle, а также несколько разговорных примеров и фрагментов кода.

  1. Базовая загрузка файла:

Для начала давайте рассмотрим простой пример загрузки файла с помощью Guzzle. Следующий фрагмент кода демонстрирует, как загрузить файл по заданному URL:

use GuzzleHttp\Client;
$client = new Client();
$response = $client->get('http://example.com/file.pdf');
$fileContent = $response->getBody()->getContents();
file_put_contents('/path/to/save/file.pdf', $fileContent);

В этом примере мы создаем новый клиент Guzzle, отправляем запрос GET на нужный URL-адрес и сохраняем содержимое тела ответа в локальный файл.

  1. Настройка заголовков запросов:

Guzzle позволяет настраивать заголовки запросов, которые могут быть полезны для аутентификации или других требований. Вот пример настройки пользовательских заголовков при загрузке файла:

use GuzzleHttp\Client;
$client = new Client();
$headers = [
    'Authorization' => 'Bearer your-token',
    'User-Agent' => 'MyDownloadApp/1.0'
];
$response = $client->get('http://example.com/file.pdf', ['headers' => $headers]);
// Save the file as before

В этом фрагменте кода мы определяем массив пользовательских заголовков и передаем его вместе с запросом. Это позволяет нам добавлять определенные заголовки, такие как токены авторизации или пользовательские агенты.

  1. Загрузка больших файлов частями:

При работе с большими файлами зачастую лучше загружать их небольшими частями, а не загружать в память весь файл. Guzzle предоставляет удобный способ сделать это с помощью параметра sinkи ресурса потока. Вот пример:

use GuzzleHttp\Client;
$client = new Client();
$stream = fopen('/path/to/save/file.pdf', 'w');
$client->get('http://example.com/large-file.pdf', ['sink' => $stream]);
fclose($stream);

В этом фрагменте кода мы используем параметр sink, чтобы указать записываемый ресурс потока, в котором будет сохранен загруженный контент. Этот подход экономит память и подходит для загрузки больших файлов.

  1. Обработка хода загрузки:

Если вы хотите отображать пользователю ход загрузки или выполнять какие-либо действия в зависимости от прогресса, Guzzle предоставляет возможность сделать это. Вот пример отслеживания хода загрузки с помощью системы событий Guzzle:

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Middleware;
use Psr\Http\Message\RequestInterface;
$client = new Client();
$handlerStack = HandlerStack::create(new CurlHandler());
$handlerStack->push(Middleware::mapRequest(function (RequestInterface $request) {
    $request = $request->withHeader('X-Progress-Enabled', 'true');
    return $request;
}));
$client = $client->withHandler($handlerStack);
$client->get('http://example.com/file.pdf', [
    'progress' => function ($downloadSize, $downloaded, $uploadSize, $uploaded) {
        echo 'Downloaded: ' . $downloaded . ' bytes' . PHP_EOL;
    }
]);

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

Guzzle предоставляет гибкий и удобный способ загрузки файлов на PHP. В этой статье мы рассмотрели различные методы загрузки файлов с помощью Guzzle, включая базовую загрузку файлов, настройку заголовков запросов, загрузку больших файлов частями и отслеживание хода загрузки. Включение этих методов в ваши проекты позволит вам легко и эффективно управлять загрузкой файлов.

Не забудьте воспользоваться обширной документацией Guzzle и изучить дополнительные функции для дальнейшей оптимизации процессов загрузки файлов.