PHP-HTTP Multipart Stream Builder 使用教程
项目介绍
php-http/multipart-stream-builder
是一个用于构建多部分 PSR-7 流的库。多部分流是一种特殊的流,用于通过 HTTP 传输文件。目前,PSR-7 标准不支持多部分流,因为它们被视为具有特殊内容的普通流。
项目快速启动
安装
首先,通过 Composer 安装 php-http/multipart-stream-builder
:
composer require php-http/multipart-stream-builder
基本使用
以下是一个简单的示例,展示如何使用 MultipartStreamBuilder
构建一个多部分流并发送 HTTP 请求:
<?php
require 'vendor/autoload.php';
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\StreamFactoryDiscovery;
use Http\Message\MultipartStream\MultipartStreamBuilder;
// 创建 StreamFactory
$streamFactory = StreamFactoryDiscovery::find();
// 初始化 MultipartStreamBuilder
$builder = new MultipartStreamBuilder($streamFactory);
// 添加资源
$builder->addResource('foo', $stream);
$builder->addResource('bar', fopen($filePath, 'r'), ['filename' => 'bar.png']);
$builder->addData('baz', ['headers' => ['Content-Type' => 'text/plain']]);
// 构建多部分流
$multipartStream = $builder->build();
$boundary = $builder->getBoundary();
// 创建请求
$request = Psr17FactoryDiscovery::findRequestFactory()->createRequest(
'POST',
'http://example.com',
['Content-Type' => 'multipart/form-data; boundary="' . $boundary . '"'],
$multipartStream
);
// 发送请求
$client = Psr18ClientDiscovery::find();
$response = $client->sendRequest($request);
// 处理响应
echo $response->getBody()->getContents();
应用案例和最佳实践
文件上传
多部分流最常见的应用场景是文件上传。以下是一个完整的示例,展示如何使用 MultipartStreamBuilder
上传文件:
<?php
require 'vendor/autoload.php';
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\StreamFactoryDiscovery;
use Http\Message\MultipartStream\MultipartStreamBuilder;
// 创建 StreamFactory
$streamFactory = StreamFactoryDiscovery::find();
// 初始化 MultipartStreamBuilder
$builder = new MultipartStreamBuilder($streamFactory);
// 添加文件资源
$builder->addResource('file', fopen('path/to/file.jpg', 'r'), ['filename' => 'file.jpg']);
// 构建多部分流
$multipartStream = $builder->build();
$boundary = $builder->getBoundary();
// 创建请求
$request = Psr17FactoryDiscovery::findRequestFactory()->createRequest(
'POST',
'http://example.com/upload',
['Content-Type' => 'multipart/form-data; boundary="' . $boundary . '"'],
$multipartStream
);
// 发送请求
$client = Psr18ClientDiscovery::find();
$response = $client->sendRequest($request);
// 处理响应
echo $response->getBody()->getContents();
混合数据上传
有时需要同时上传文件和表单数据。以下是一个示例,展示如何混合上传文件和表单数据:
<?php
require 'vendor/autoload.php';
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\StreamFactoryDiscovery;
use Http\Message\MultipartStream\MultipartStreamBuilder;
// 创建 StreamFactory
$streamFactory = StreamFactoryDiscovery::find();
// 初始化 MultipartStreamBuilder
$builder = new MultipartStreamBuilder($streamFactory);
// 添加文件资源
$builder->addResource('file', fopen('path/to/file.jpg', 'r'), ['filename' => 'file.jpg']);
// 添加表单数据
$builder->addData('name', 'John Doe');
$builder->addData('email', 'john@example.com');
// 构建多部分流
$