使用AWS SDK PHP v2 upload(),Amazon S3设置元数据失败

时间:2013-09-20 03:27:40

标签: php file-upload amazon-web-services amazon-s3

使用AWS SDK PHP v2将文件上传到Amazon S3时,我在设置“元数据”选项时遇到问题。 upload()方法的documentation that I'm reading表示第5个参数是一个选项数组......

  

* $ options执行命令时使用的自定义选项: - params:Custom   用于上传的参数。 参数必须映射到a   PutObject 或InitiateMultipartUpload操作参数。 -   min_part_size:允许每个上传部分的最小大小   执行分段上传。 - 并发:最大数量   并发分段上传。 - before_upload:回调调用   在每个分段上传之前。回调将收到一个   带有上下文的Guzzle \ Common \ Event对象。*

我的upload()代码看起来像这样..

$upload = $client->upload(
  '<BUCKETNAME>',
  'metadatatest.upload.jpg',
  fopen('metadatatest.jpg','r'),
  'public-read',
  array('Metadata' => array(
    'SomeKeyString' => 'SomeValueString'
  ))
);

...上传后没有设置元数据。

但是,如果我使用putObject() as documented here,我认为与upload()相比,这是一种“较低级”方法...

$putObject = $client->putObject(
  array(
    'Bucket' => '<BUCKETNAME>',
    'Key' => 'metadatatest.putobject.jpg',
    'Body' => file_get_contents('metadatatest.jpg'),
    'ACL' => 'public-read',
    'Metadata' => array(
      'SomeKeyString' => 'SomeValueString'
    )
  )
);

当我使用getObject()

上传putObject()或直接在浏览器中查看文件时,会成功返回元数据
$getObject = $client->getObject(
  array(
    'Bucket' => '<BUCKETNAME>',
    'Key' => 'metadatatest.putobject.jpg'
  )
);

我更愿意使用$client->upload()方法作为文档说明

  

将文件,流或字符串上传到存储桶。如果上载大小超过指定的阈值,则将使用执行上载   并行分段上传。

我不确定我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果您不进行分段上传,使用upload()putObject()确实没有区别。您可以查看AWS PHP SDK source code,但基本上upload方法只需调用putObject,如下所示:

// Perform a simple PutObject operation
return $this->putObject(array(
    'Bucket' => $bucket,
    'Key'    => $key,
    'Body'   => $body,
    'ACL'    => $acl
) + $options['params']);

这在SDK文档中不是很清楚,但您需要将最后一个参数作为数组发送,其中键为params,其值为第二个数组,其中包含Metadata键和值像这样:

$upload = $client->upload(
    '<BUCKETNAME>',
    'metadatatest.upload.jpg',
    fopen('metadatatest.jpg','r'),
    'public-read',
    array('params' => array(
        'Metadata' => array(
            'SomeKeyString' => 'SomeValueString'
    )))
);

但是,我可以使用putObject调用来实现同样的目的。