2011-10-04 4 views
2

Я использую класс PHP Amazon S3 для загрузки изображений, но заголовки кеша не устанавливаются. Вот звонок, который я использую.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

Пятно на! Большое спасибо. Не понял, что я использовал что-то обесцененное, предположим, что это происходит, когда вы слепо следуете учебному курсу онлайн, не проверяя его дату публикации. – Lamoni

1

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

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

+1

Эти заголовки посылаются так Amazon знает, что заголовки отправить обратно клиенту, когда клиент запрашивает этот конкретный образ, Я знаю, что они не предназначены для перехода на сервер в качестве заголовков, а как метаданные. – Lamoni

+1

Также спасибо за идею ETag и Last-Modified, я загляну в нее – 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", ) );

Смежные вопросы