2011-10-04 121 views
2

我正在使用Amazon S3 PHP类上传图像,但未设置缓存标头。这是我正在使用的电话。Amazon S3无法缓存图像

$s3->putObjectFile(
    $image_location, 
    "bucketname", 
    $image_file_name, 
    S3::ACL_PUBLIC_READ, 
    array(
     "Cache-Control" => "max-age=315360000", 
     "Expires" => gmdate("D, d M Y H:i:s T", strtotime("+5 years")) 
    ) 
); 

我得到用于上载的图像的标头响应是:

 
Date: Tue, 04 Oct 2011 04:21:09 GMT 
x-amz-request-id: B6BAAAAD9B460160 
Content-Length: 34319 
x-amz-id-2: Oxxx1hIG2nNKfff3vgH/xx/dffF59O/7a1UWrKrgZlju2g/8WvTcBpccYToULbm 
Last-Modified: Tue, 04 Oct 2011 04:19:20 GMT 
Server: AmazonS3 
ETag: "4846afffbc1a7284fff4a590d5acd6cd" 
Content-Type: image/jpeg 
Accept-Ranges: bytes 

回答

7

我对Amazon S3 PHP Class不熟悉,但快速查看documentation,发现putObjectFile方法折旧,您应该使用putObject代替。

<?php 

    // PUT with custom headers: 
    $put = S3::putObject(
     S3::inputFile($file), 
     $bucket, 
     $uri, 
     S3::ACL_PUBLIC_READ, 
     array(), 
     array(// Custom $requestHeaders 
      "Cache-Control" => "max-age=315360000", 
      "Expires" => gmdate("D, d M Y H:i:s T", strtotime("+5 years")) 
     ) 
    ); 
    var_dump($put); 

?> 

但是,为什么不考虑使用官方Amazon SDk for PHP

您将使用create_object上传文件。该official docs有一些很好的例子:

// Instantiate the class 
$s3 = new AmazonS3(); 

$response = $s3->create_object('my-bucket', 'üpløåd/î\'vé nøw béén üpløådéd.txt', array(
    'fileUpload' => 'upload_me.txt', 
    'acl' => AmazonS3::ACL_PUBLIC, 
    'contentType' => 'text/plain', 
    'storage' => AmazonS3::STORAGE_REDUCED, 
    'headers' => array(// raw headers 
     'Cache-Control' => 'max-age', 
     'Content-Encoding' => 'gzip', 
     'Content-Language' => 'en-US', 
     'Expires' => 'Thu, 01 Dec 1994 16:00:00 GMT', 
    ), 
    'meta' => array(
     'word' => 'to your mother', // x-amz-meta-word 
     'ice-ice-baby' => 'too cold, too cold' // x-amz-meta-ice-ice-baby 
    ), 
)); 

// Success? 
var_dump($response->isOK()); 
+0

Spot on!非常感谢你。没有意识到我正在使用折旧的东西,猜测这是当你盲目地按照教程在线而不检查其发布日期时会发生什么。 – Lamoni

1

Cache-ControlExpires头是从服务器发送到客户端,以指示该数据的高速缓存客户机。在你的情况下,你有客户端发送这些头到服务器没有意义。我相信你的意图是向S3发送标题,然后当另一个客户请求文件时,你期望它们由S3提供。我相信这不被支持。

然而,S3提供ETAgLast-Modified标题应该是足够了最实用的目的,因为几乎没有任何理由,除非它了S3的更新您的客户端重新下载文件(在这种情况下ETagLast-Modified会发生变化)。

+1

这些头被发送,从而亚马逊知道,当客户端请求特定的图像送什么头回客户端,我知道他们不打算作为标题去服务器,而是作为元数据。 – Lamoni

+1

此外,感谢ETag和最后修改的想法,我会研究它 – Lamoni

1

S3::putObjectFile不接受请求头。你正在看的论点是Meta Headers这是不完全相同的事情。

S3::putObjectFile是只是一个包装围绕S3::putObject反正所以下面的工作就好了

$s3->putObject( S3::inputFile($image_location), "bucketname", $image_file_name, S3::ACL_PUBLIC_READ, array(), // meta headers array( // request headers "Cache-Control" => "max-age=315360000", ) );