繁体   English   中英

从PHP AWS SDK设置S3对象的缓存控制HTTP标头

[英]Set Cache-Control HTTP Header for S3 Objects from PHP AWS SDK

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

缓存控件未通过“ 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()会为5MB的文件包装putObject() ,否则会发起分段上传请求。

如果要将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'
));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM