使用Guzzle PHP将s3文件用于多部分/表单数据上传

时间:2014-05-07 15:20:24

标签: php curl amazon-web-services amazon-s3 guzzle

我正在尝试获取托管在Amazon S3上的文件,并使用Content-Type:multipart / form-data post请求将其上传到另一台服务器。我可以使用Curl --form,但我不知道如何让S3文件像本地文件一样运行,以便我可以做这样的事情。

curl -F "file=@localfile;filename=nameinpost" url.com

我设置了guzzle,以便我可以像这样使用流包装器

$this->guzzleClient->registerStreamWrapper(); $data = file_get_contents('s3://buck/test-file.jpg');

如果我可以使这个流工作得很好,或者只能使用本地文件?做这种事情最优化的方法是什么?

2 个答案:

答案 0 :(得分:0)

AWS SDK for PHP使用Guzzle,专门为S3提供了一个流包装器。请参阅Amazon S3 Stream Wrapper

答案 1 :(得分:0)

我想出了类似的东西。

//...configure an s3client
$this->s3client->registerStreamWrapper();

$filename = sys_get_temp_dir() .'/'. $unique_name;
$handle = fopen($filename, 'w+');
$bytes_written = fwrite( $handle, file_get_contents('s3://bucket/test-file.jpg'));

//...configure a Guzzle client

//Guzzle 3.0
$request = $this->client->post('image')->addPostFile('images', $filename);
$response = $request->send();

//Guzzle 4.0
$request = $this->client->createRequest('POST', 'images');
$request->getBody()->addFile(new PostFile('image', $handle));
$response = $this->client->send($request);

//remove the file
unlink($filename);

Guzzle 4.0还有一些较新的功能,允许直接使用流而无需创建此临时文件。但是,我无法使用期望http://www.faqs.org/rfcs/rfc1867.html之后基于表单的文件上传的服务。如果可以使用更好的流!

有关详细信息,请参阅此处http://mtdowling.com/blog/2014/03/15/guzzle-4-rc中的“更好的POST文件支持”,从版本3到4的过渡确实让我感到困惑。确保您知道您的客户是哪个版本,并且您正在阅读该版本的文档:)