【问题标题】:Set Cache-Control HTTP Header for S3 Objects from PHP AWS SDK从 PHP AWS SDK 为 S3 对象设置缓存控制 HTTP 标头
【发布时间】:2013-10-25 06:20:25
【问题描述】:

我使用 Amazon SDK for PHP 并尝试在图像上设置缓存控制标头。当我尝试通过 MetaData = array("Cache-Control") 添加它时,它会在我登录到 S3 存储桶时将其更改为 x-amz-meta-cache-control,并且当我下载文件时,没有缓存-控制集。但如果我手动更改此设置,缓存控件将完美运行。是否有一些我遗漏的参数可用于在上传时以编程方式设置 HTTP 请求标头?我正在使用 PutObject 方法。我相信 AWS SDK 是从 2013 年开始的。

【问题讨论】:

  • 如果对您有帮助,请您将我的回答标记为“已接受”。

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


【解决方案1】:

缓存控件不是通过“MetaData”索引设置的,“CacheControl”与“MetaData”处于同一级别,不包含在其中。

http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html#_putObject

您可以使用类似的东西作为 putObject() 方法的配置数组...

$s3client->putObject(array(
  'Bucket' => '...',
  'key' => '...',
  'body' => '...',
  'CacheControl' => 'max-age=172800',
  'MetaData' => array(
    'metaKey' => 'metaValue',
    'metaKey' => 'metaValue'
)));

对于upload()方法...

$s3client->upload(
  'bucket',
  'key',
  fopen('sourcefile','r'),
  'public-read',
  array('params' => array(
    'CacheControl' => 'max-age=172800',
    'Metadata' => array(
      'metaKey' => 'metaValue',
      'metaKey' => 'metaValue'
))));

另外,值得指出的是,upload() 将包装 putObject() 用于大小为 5MB 的文件,否则它将启动分段上传请求。

【讨论】:

    【解决方案2】:

    如果您想将 CacheControl 标头添加到存储桶中已有的项目,请使用 SDK 的 copyObject 方法。将 MetadataDirective 参数设置为 REPLACE 以使项目覆盖自身。

    我注意到一件奇怪的事情:我也必须设置 ContentType 标头,即使它已经设置好了。否则,图像不会在浏览器中内嵌显示,而是作为下载提供。

    $result = $s3->copyObject(array(
        'ACL' => 'public-read',
        'Bucket' => $bucket, // target bucket
        'CacheControl' => 'public, max-age=86400',
        'ContentType' => 'image/jpeg', // !!
        'CopySource' => urlencode($bucket . '/' . $key),
        'Key' => $key, // target file name
        'MetadataDirective' => 'REPLACE'
    ));
    

    【讨论】:

    • 您能帮我更新 laravel PHP 中现有对象的元数据吗?我已经尝试过您的解决方案,但无法更新现有文件的元数据。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2023-04-08
    • 2014-08-18
    • 2011-01-28
    • 2019-01-14
    • 2011-10-01
    相关资源
    最近更新 更多