Amazon S3没有缓存图像


Amazon S3 not caching images

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

$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"))
    )
);

我得到的头部响应为上传的图像是:

<>之前日期:星期二,2011年10月4日04:21:09 GMTx-amz-request-id: B6BAAAAD9B460160内容长度:34319x-amz-id-2: Oxxx1hIG2nNKfff3vgH/xx/dffF59O/7 a1uwrkrgzlju2g/8 wvtcbpccytoulbm最后修改日期:2011年10月4日星期二04:19:20 GMT服务器:AmazonS3ETag:"4846 afffbc1a7284fff4a590d5acd6cd"内容类型:图像/jpegAccept-Ranges:字节

我不熟悉Amazon S3 PHP类,但快速浏览文档显示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官方的PHP SDk呢?

您将使用create_object上传文件。官方文档中有一些很好的例子:

// 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());

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

然而,S3提供的ETAgLast-Modified头应该足以满足大多数实际目的,因为您的客户端几乎没有理由重新下载文件,除非它在S3中更新(在这种情况下,ETagLast-Modified将更改)。

S3::putObjectFile不接受Request Headers。您正在查看的参数是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", ) );