【问题标题】:Use s3 file for multipart/form-data upload using Guzzle PHP使用 Guzzle PHP 使用 s3 文件进行多部分/表单数据上传
【发布时间】:2014-06-24 16:03:42
【问题描述】:

我正在尝试获取托管在 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');

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

【问题讨论】:

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


    【解决方案1】:

    使用 Guzzle 的 AWS SDK for PHP 提供了专门用于 S3 的流包装器。见Amazon S3 Stream Wrapper

    【讨论】:

      【解决方案2】:

      我想出了这样的东西。

      //...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 之后进行基于表单的文件上传的服务来实现此功能。如果可以使用流就更好了!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 2013-05-08
        • 2018-02-27
        • 2022-08-22
        相关资源
        最近更新 更多