Amazon S3 не кеширует изображения - PullRequest
2 голосов
/ 04 октября 2011

Я использую 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

Ответы [ 3 ]

7 голосов
/ 04 октября 2011

Я не знаком с Amazon S3 PHP Class , но быстрый взгляд на документацию показывает, что метод 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 для PHP ?

Вы бы использовали 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());
1 голос
/ 28 июня 2014

S3::putObjectFile не принимает заголовки запроса. Аргумент, на который вы смотрите: мета-заголовки , что не совсем то же самое.

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

1 голос
/ 04 октября 2011
Заголовки

Cache-Control или Expires должны отправляться с сервера на клиент, чтобы проинструктировать клиента о кэшировании данных. В вашем случае у вас есть клиент, отправляющий эти заголовки на сервер, который не имеет смысла. Я полагаю, что вы намереваетесь отправить заголовки на S3, а затем вы ожидаете, что они будут предоставлены S3, когда другой клиент запрашивает файл. Это не поддерживается, я считаю.

Однако S3 предоставляет заголовки ETAg и Last-Modified, которые должны быть достаточными для большинства практических целей, поскольку у вашего клиента вряд ли есть причины перезагружать файл, если он не обновлен в S3 (в данном случае ETag и Last-Modified изменится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...