2013-04-25 118 views
2

我已將近25k個文件(大型媒體文件)上傳到s3存儲桶。我用PHP的AWS SDK2(S3Client::putObject)執行上傳。現在,我需要更新這些文件的元數據,即將ContentDisposition更改爲附件並分配文件名。如何更新AWS S3存儲桶中的對象屬性

有沒有辦法執行此操作而無需重新上傳文件?請幫忙。

+0

你找到一個解決的辦法?我唯一看到的就是'copyObject'。 – dsummersl 2013-06-28 13:28:32

+0

@dsummersl是的,copyObject是唯一的出路,據我所知。 – mishka 2013-11-05 13:00:24

回答

1

是的,您可以使用copyObject method,其中您設置CopySource參數等於BucketKey參數。

例子:

// setup your $s3 connection, and define the bucket and key for your resource. 
$s3->copyObject(array(
    'Bucket' => $bucket, 
    'CopySource' => "$bucket/$key", 
    'Key' => $key, 
    'Metadata' => array(
    'ExtraHeader' => 'HEADER VALUE' 
), 
    'MetadataDirective' => 'REPLACE' 
)); 
+0

我還沒有試過CopySource。所以,我將不得不做一個副本,然後刪除舊的。我要試試這個。 – mishka 2013-07-10 07:35:53

+1

好的。最後這裏是我如何使用copyObject和deleteObject的混合來實現目標。 1.將具有更新元標記的原始對象複製到臨時文件夾。 2.刪除原件。 3.將溫度複製到原始位置。 4.從臨時位置刪除副本。 對於這樣簡單的事情來說,付出的努力太多了。不幸的是,沒有使用PHP SDK的替代方法。 – mishka 2013-11-08 10:18:01

1

更新緩存控制元數據的S3對象

<?php 
define('S3_BUCKET', 'bucket-name'); 
define('S3_ACCESS_KEY', 'your-access-key'); 
define('S3_SECRET_KEY', 'secret-key'); 
define('S3_REGION', 'ap-south-1'); //Mumbai 

require 'vendors/aws/aws-autoloader.php'; 

use Aws\S3\S3Client; 
use Aws\S3\Exception\S3Exception; 

try { 
    $s3 = S3Client::factory(array(
       'version' => 'latest', 
       'region' => S3_REGION, 
       'credentials' => array(
        'secret' => S3_SECRET_KEY, 
        'key' => S3_ACCESS_KEY, 
       ) 
    )); 

    $objects = $this->s3->getIterator('ListObjects', array('Bucket' => S3_BUCKET)); 

    echo "Keys retrieved!\n"; 
    foreach ($objects as $object) { 
     echo $object['Key'] . "\n"; 
     $s3->copyObject(array(
      'Bucket' => S3_BUCKET, 
      'CopySource' => S3_BUCKET . '/' . $object['Key'], 
      'Key' => $key, 
      'ContentType' => 'image/jpeg', 
      'ACL' => 'public-read', 
      'StorageClass' => 'REDUCED_REDUNDANCY', 
      'CacheControl' => 'max-age=172800', 
      'MetadataDirective' => 'REPLACE' 
     )); 
    } 
} catch (S3Exception $e) { 
    echo $e->getMessage() . "\n"; 
} 
+0

與現在的答案有什麼不同? – mishka 2017-07-04 15:13:04