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



在使用 AWS SDK PHP v2 将文件上传到 Amazon S3 时,我在设置"元数据"选项时遇到问题。我正在阅读的 upload() 方法的文档指出,第 5 个参数是一个选项数组......

*$options 执行命令时使用的自定义选项: - 参数:自定义 要用于上传的参数。参数必须映射到 放置对象或启动分段上传操作参数。- 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(),我认为与upload()相比,这是一种"较低级别"的方法......

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

当我使用 putObject() 上传时,当我调用getObject()或直接在浏览器中查看文件时,元数据已成功返回

$getObject = $client->getObject(
  array(
    'Bucket' => '<BUCKETNAME>',
    'Key' => 'metadatatest.putobject.jpg'
  )
);

我更喜欢使用 $client->upload() 方法,如文档所述

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

不确定我错过了什么?

如果您不进行分段上传,使用 upload()putObject() 实际上没有区别。您可以查看 AWS PHP SDK 源代码,但基本上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 调用来实现同样的事情。

最新更新