从PHP AWS SDK为S3对象设置Cache-Control HTTP标头

use*_*584 13 php amazon-s3 amazon-web-services

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

Scu*_*zzy 23

缓存控件不是通过"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'
)));
Run Code Online (Sandbox Code Playgroud)

对于upload()方法......

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

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


Ron*_*dPK 12

如果要将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'
));
Run Code Online (Sandbox Code Playgroud)