【问题标题】:Amazon S3 not caching imagesAmazon S3 不缓存图像
【发布时间】:2011-10-04 04:25:30
【问题描述】:

我正在使用 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 GMT x-amz 请求 ID:B6BAAAAD9B460160 内容长度:34319 x-amz-id-2:Oxxx1hIG2nNKfff3vgH/xx/dffF59O/7a1UWrKrgZlju2g/8WvTcBpccYToULbm 最后修改时间:2011 年 10 月 4 日星期二 04:19:20 GMT 服务器:亚马逊S3 ETag:“4846afffbc1a7284fff4a590d5acd6cd” 内容类型:图片/jpeg 接受范围:字节

【问题讨论】:

    标签: php amazon-s3


    【解决方案1】:

    我对@9​​87654321@ 不熟悉,但快速查看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());
    

    【讨论】:

    • 看准了!非常感谢。没有意识到我在使用贬值的东西,猜猜这就是当你盲目地按照在线教程而不检查其发布日期时会发生的情况。
    【解决方案2】:

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

    但是,S3 提供的 ETAgLast-Modified 标头对于大多数实际用途来说应该足够了,因为您的客户端几乎没有任何理由重新下载文件,除非它在 ​​S3 中更新(在这种情况下为 ETag 和 @ 987654326@ 将更改)。

    【讨论】:

    • 发送这些标头是为了让亚马逊知道当客户端请求该特定图像时将哪些标头发送回客户端,我知道它们不是要作为标头发送到服务器,而是作为元数据。
    • 另外,感谢 ETag 和 Last-Modified 的想法,我会研究一下
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2023-04-03
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多