1

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

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

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

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

如果我能让这个流工作会很棒,还是只能使用本地文件?做这种事情的最优化方法是什么?

4

2 回答 2

0

使用 Guzzle的AWS SDK for PHP提供了专门用于 S3 的流包装器。请参阅Amazon S3 流包装器

于 2014-05-07T19:23:02.780 回答
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 的转换确实让我有些困惑。确保您知道您的客户是什么版本,并且您正在阅读该版本的文档 :)

于 2014-05-11T19:53:25.587 回答