2013-10-16 1 views
9

Ich benutze das Amazon SDK für PHP und versuchen, Cache-Control-Header auf dem Bild zu setzen. Wenn ich versuche, es über MetaData = array ("Cache-Control") hinzuzufügen, ändert es sich zu x-amz-meta-cache-control, wenn ich mich beim S3-Bucket anmelde, und wenn ich die Datei herunterlade, gibt es keinen Cache -Kontrollset. Aber wenn ich diese Einstellung manuell ändere, funktioniert die Cache-Kontrolle perfekt. Gibt es einen fehlenden Parameter, mit dem ich HTTP-Anforderungsheader programmatisch beim Upload festlegen kann? Ich verwende die PutObject-Methode. Ich glaube, dass das AWS SDK von 2013 ist.Set-Cache HTTP-Header für S3-Objekte von PHP AWS SDK

+0

Können Sie bitte meine Antwort als "akzeptiert" markieren, wenn es Ihnen geholfen hat. – Scuzzy

Antwort

16

Die Cache-Kontrolle wird nicht über den "MetaData" Index gesetzt, "CacheControl" ist auf der gleichen Ebene wie "MetaData", nicht darin enthalten.

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

Sie so etwas wie dies als Konfigurations Array für die() -Methode putObject verwenden würde ...

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

Für den Upload() Methode ...

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

Auch, es ist erwähnenswert, dass upload()wickeln wirdfür Dateien mit einer Größe von 5 MB, andernfalls wird eine mehrteilige Upload-Anfrage ausgelöst.

8

Wenn Sie den Header CacheControl zu einem bereits in Ihrem Bucket vorhandenen Element hinzufügen möchten, verwenden Sie die SDK-Methode copyObject. Setzen Sie den Parameter MetadataDirective auf REPLACE, um das Element selbst zu überschreiben.

Ich bemerkte eine seltsame Sache: Ich musste die ContentType Header auch setzen, obwohl es bereits eingestellt war. Andernfalls wird das Bild nicht im Browser angezeigt, sondern als Download angeboten.

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