我正在尝试获取Amazon S3上托管的文件,并使用Content-Type:multipart / form-data发布请求将其上传到另一台服务器。我可以使用Curl --form
它,但是我不确定如何使S3文件表现得像本地文件一样,以便可以执行类似的操作。
curl -F "file=@localfile;filename=nameinpost" url.com
我已设置好枪口,以便可以像这样使用流包装器
$this->guzzleClient->registerStreamWrapper(); $data = file_get_contents('s3://buck/test-file.jpg');
如果我可以使此流正常工作,那还是很棒,还是只能使用本地文件?做这种事情的最优化方法是什么?
我想出了这样的东西。
//...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的过渡确实使我有些困惑。确保您知道客户使用的是哪个版本,并且正在阅读该版本的文档:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句