Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP AWS SDK为S3对象设置缓存控制HTTP头_Php_Amazon Web Services_Amazon S3 - Fatal编程技术网

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

从PHP AWS SDK为S3对象设置缓存控制HTTP头,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我正在使用AmazonSDKforPHP并尝试在图像上设置缓存控制头。当我尝试通过MetaData=array(“Cache-Control”)添加它时,当我登录到S3存储桶时,它将其更改为x-amz-meta-Cache-Control,当我下载文件时,没有缓存控制集。但是,如果我手动更改此设置,则缓存控件可以完美地工作。我是否缺少一些参数,可以用来在上传时以编程方式设置HTTP请求头?我用的是PutObject方法。我相信AWS SDK是从2013年开始的。缓存控制不是通过“元数据”索引设置

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

缓存控制不是通过“元数据”索引设置的,“缓存控制”与“元数据”处于同一级别,不包含在其中

您可以使用这样的内容作为putObject()方法的配置数组

$s3client->putObject(array(
  'Bucket' => '...',
  'key' => '...',
  'body' => '...',
  'CacheControl' => 'max-age=172800',
  'MetaData' => array(
    'metaKey' => 'metaValue',
    'metaKey' => 'metaValue'
)));
$s3client->upload(
  'bucket',
  'key',
  fopen('sourcefile','r'),
  'public-read',
  array('params' => array(
    'CacheControl' => 'max-age=172800',
    'Metadata' => array(
      'metaKey' => 'metaValue',
      'metaKey' => 'metaValue'
))));
对于upload()方法

$s3client->putObject(array(
  'Bucket' => '...',
  'key' => '...',
  'body' => '...',
  'CacheControl' => 'max-age=172800',
  'MetaData' => array(
    'metaKey' => 'metaValue',
    'metaKey' => 'metaValue'
)));
$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
头添加到bucket中已经存在的项,请使用SDK的
copyObject
方法。设置要替换的
MetadataDirective
参数,使项目覆盖自身

我注意到一件奇怪的事情:我还必须设置
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中现有对象的元数据吗?我已尝试过您的解决方案,但无法更新现有文件的元数据。谢谢