我正在尝试获取托管在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');
如果我可以使这个流工作得很好,或者只能使用本地文件?做这种事情最优化的方法是什么?
答案 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的过渡确实让我感到困惑。确保您知道您的客户是哪个版本,并且您正在阅读该版本的文档:)