Загрузить файл кусками в конечную точку URL с помощью Guzzle PHP

Я хочу загружать файлы кусками в конечную точку URL с помощью жадности.

Я должен быть в состоянии предоставить заголовки Content-Range и Content-Length.

Используя php, я знаю, что могу разделить, используя

define('CHUNK_SIZE', 1024*1024); // Size (in bytes) of chunk

function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt    = 0;
    $handle = fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();

        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }

    $status = fclose($handle);

    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }

    return $status;
}

Как мне добиться отправки файлов в чанке с помощью жадности, если это возможно, с использованием потоков жадности?

2 ответа

Этот метод позволяет передавать большие файлы, используя потоки жадности:

use GuzzleHttp\Psr7;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$resource = fopen($pathname, 'r');
$stream = Psr7\stream_for($resource);

$client = new Client();
$request = new Request(
        'POST',
        $api,
        [],
        new Psr7\MultipartStream(
            [
                [
                    'name' => 'bigfile',
                    'contents' => $stream,
                ],
            ]
        )
);
$response = $client->send($request);

Просто используйте multipart тип кузова, как описано в документации. Затем cURL выполняет внутреннее чтение файла, поэтому вам не нужно реализовывать chunked read самостоятельно. Также все необходимые заголовки будут настроены с помощью Guzzle.

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