2011-10-04 6 views
2

J'utilise la classe PHP Amazon S3 pour télécharger des images, mais les en-têtes de cache ne sont pas définis. Voici l'appel que j'utilise.Amazon S3 ne met pas en cache les images

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

La réponse d'en-tête que je reçois pour l'image téléchargée est:

 
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 

Répondre

7

Je ne connais pas le Amazon S3 PHP Class mais un coup d'œil à la documentation révèle que la méthode putObjectFile est dépréciée et vous devez utiliser putObject à la place.

<?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); 

?> 

Mais pourquoi ne pas envisager d'utiliser le Amazon SDk for PHP officiel?

Vous utiliseriez create_object pour télécharger un fichier. Les official docs ont quelques bons exemples:

// 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! Merci beaucoup. Je n'ai pas réalisé que j'utilisais quelque chose de déprécié, devinez que c'est ce qui se passe quand vous suivez aveuglément un tutoriel en ligne sans vérifier sa date de publication. – Lamoni

1

Cache-Control ou Expires têtes doivent être envoyés du serveur au client pour demander la mise en cache client sur des données. Dans votre cas, vous avez un client qui envoie ces en-têtes au serveur, ce qui n'a aucun sens. Je crois que vous avez l'intention d'envoyer des en-têtes à S3 et vous vous attendez à ce qu'ils soient fournis par S3 lorsqu'un autre client demande le fichier. Ce n'est pas supporté, je crois.

Cependant, S3 fournit des en-têtes ETAg et Last-Modified qui devraient être suffisantes à des fins plus pratiques car il n'y a guère de raison pour votre client retélécharger le fichier à moins qu'il soit mis à jour dans S3 (dans ce cas ETag et Last-Modified changera).

+1

Ces têtes sont envoyés si Amazon sait ce que les en-têtes à envoyer au client lorsque le client demande que l'image spécifique, Je sais qu'ils ne sont pas destinés au serveur en tant qu'en-têtes, mais en tant que méta-données. – Lamoni

+1

Aussi, merci pour l'idée ETag et Last-Modified, je vais regarder dans – Lamoni

1

S3::putObjectFile n'accepte pas têtes de demande. L'argument que vous regardez est Meta Headers ce qui n'est pas tout à fait la même chose.

S3::putObjectFile est juste une enveloppe autour S3::putObject de toute façon donc ce qui suit fonctionnera très bien

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