如何为 AWS S3 图像添加 Http 标头

Posted

技术标签:

【中文标题】如何为 AWS S3 图像添加 Http 标头【英文标题】:How to Add Http Hearders for AWS S3 images 【发布时间】:2015-02-11 01:08:19 【问题描述】:

这是我的代码

function s3UploadImage($tmpFile,$file) 
     $tmpLoc=$bucket.$file;
    $s3 = new S3(awsAccessKey, awsSecretKey);
    $s3->putBucket($bucket, S3::ACL_PUBLIC_READ);
    if($s3->putObjectFile($tmpFile, $bucket , $tmpLoc, S3::ACL_PUBLIC_READ, array(
                 "Cache-Control" => "max-age=94608000",
                 "Expires" => gmdate("D, d M Y H:i:s T", 
                              strtotime("+3 years")),$contentType) )
    
        $msg = "S3 Upload Successful.";
    //  $s3file='https://xxxxxxxxxxxxx.xxxxxxx/'.$tmpLoc;
    $s3file='https://xxxxxxxxxxxxxxx.xxxxxxx/'.$tmpLoc;
//              echo "<img src='$s3file'/>";
                echo 'S3 File URL:'.$s3file;
        $status=true;
    
    else
        $msg = "S3 Upload Fail.";
        $status=false;
    
    return $status;

在这段代码中,我添加了 array("Cache-Control" => "max-age=31536000","Expires" => gmdate("D, d MYH:i:s T", strtotime("+3 years ")) 它的工作正常。但它像这样添加

  x-amz-meta-cache-control  public,max-age=31536000
    x-amz-meta-expires  Wed, 11 Dec 2017 10:47:59 GMT 

在谷歌页面速度测试工具中仍然显示未指定过期 但是如果我使用 s3 browser 等工具直接在 s3 中添加 http Header 。它工作正常。它像这样添加

Expires Wed, 15 May 2019 20:00:00
Cache-Control   max-age=31536000, public

使用api如何添加这样的http headers。

【问题讨论】:

【参考方案1】:

您在此处添加的标题类似于自定义元数据。在创建自定义元数据时,您的 SDK 将附加 x-amz-meta- 以及您的元数据密钥以识别它。 您必须将此标头设置为,

$result = $s3->putObject(array(
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'SourceFile'   => $filepath,
    'ContentType'  => 'text/plain',
    'Expires'      => 'Wed, 15 May 2019 20:00:00',
    'CacheControl' => 'max-age=31536000, public',
    'ACL'          => 'public-read',
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => array(    
        'param1' => 'value 1',
        'param2' => 'value 2'
     )
));

【讨论】:

这是有效的,已于 2019 年 7 月 25 日确认。【参考方案2】:

我也有同样的问题。我解决了这个问题,检查我下面的代码

$metaHeaders = array();
$requestHeaders['Cache-Control'] = 'public, max-age=31536000';
$requestHeaders['Expires'] = gmdate("D, d M Y H:i:s T", strtotime("+1 years"));


 if($s3->putObject($tmpFile, $bucket , $tmpLoc, S3::ACL_PUBLIC_READ, $metaHeaders, $requestHeaders) 

使用putObject 方法代替putObjectFile 方法并设置$requestHeaders 这行得通

【讨论】:

以上是关于如何为 AWS S3 图像添加 Http 标头的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk / S3 / CloudFront Cache-Control 标头

AWS S3 - 如何为 Android 获取正确的凭证?

如何为 AWS 放大 GraphQL API 添加服务器端业务逻辑?

如何为 ECS 添加带有应用程序负载均衡器的 AWS API 网关?

如何为图像添加渐变?

请求的资源(AWS、API Gateway、S3、CORS)上不存在“Access-Control-Allow-Origin”标头