2013-10-16 7 views
9

PHP用のAmazon SDKを使用し、画像にキャッシュコントロールヘッダーを設定しようとしています。 MetaData = array( "Cache-Control")で追加しようとすると、S3バケットにログインするとx-amz-meta-cache-controlに変更され、ファイルをダウンロードするとキャッシュはありません-control set。しかし、私がこの設定を手動で変更すると、Cache-controlは完全に機能します。アップロード時にプログラムでHTTPリクエストヘッダーを設定するために使用できないパラメータがありますか?私はPutObjectメソッドを使用しています。PHPからS3オブジェクトのCache-Control HTTPヘッダを設定するAWS SDK

+0

私の答えに役立つ場合は、「受け入れ済み」と表示してください。 – Scuzzy

答えて

16

キャッシュコントロールが "MetaData"インデックスで設定されていない場合、 "CacheControl"は "MetaData"と同じレベルにあり、その中には含まれていません。あなたがのputObject()メソッドのためのコンフィギュレーション配列として、このようなものを使用したい

http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html#_putObject

...アップロード()メソッドについては

$s3client->putObject(array(
    'Bucket' => '...', 
    'key' => '...', 
    'body' => '...', 
    'CacheControl' => 'max-age=172800', 
    'MetaData' => array(
    'metaKey' => 'metaValue', 
    'metaKey' => 'metaValue' 
))); 

...

$s3client->upload(
    'bucket', 
    'key', 
    fopen('sourcefile','r'), 
    'public-read', 
    array('params' => array(
    'CacheControl' => 'max-age=172800', 
    'Metadata' => array(
     'metaKey' => 'metaValue', 
     'metaKey' => 'metaValue' 
)))); 

また、upload()は、サイズが5MBのファイルの場合は、それ以外の場合はマルチパートアップロード要求が開始されます。

8

バケツに既に入っているアイテムにCacheControlヘッダーを追加する場合は、SDKのcopyObjectメソッドを使用します。 MetadataDirective paramをREPLACEに設定して、項目を上書きします。

私は奇妙なことに気付きました:既に設定されていてもContentTypeヘッダーを設定しなければなりませんでした。そうしないと、イメージはブラウザではインラインで表示されず、ダウンロードとして提供されます。

$result = $s3->copyObject(array(
    'ACL' => 'public-read', 
    'Bucket' => $bucket, // target bucket 
    'CacheControl' => 'public, max-age=86400', 
    'ContentType' => 'image/jpeg', // !! 
    'CopySource' => urlencode($bucket . '/' . $key), 
    'Key' => $key, // target file name 
    'MetadataDirective' => 'REPLACE' 
));