我使用 Amazon SDK for PHP 并尝试在图像上设置缓存控制标头。当我尝试通过 MetaData = array("Cache-Control") 添加它时,它会在我登录到 S3 存储桶时将其更改为 x-amz-meta-cache-control,并且当我下载文件时,没有缓存-控制集。但如果我手动更改此设置,缓存控件将完美运行。是否有一些我遗漏的参数可用于在上传时以编程方式设置 HTTP 请求标头?我正在使用 PutObject 方法。我相信 AWS SDK 是从 2013 年开始的。
问问题
19608 次
2 回答
25
缓存控件不是通过“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 的文件,否则它将启动分段上传请求。
于 2013-10-16T23:00:43.180 回答
15
如果要将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'
));
于 2015-03-18T09:09:54.003 回答