2008-11-06 17 views

cevap

34

Bu beta işlevselliğidür, ancak siz copy an object numaralı telefondan yeni meta verileri belirtebilirsiniz. Kopya için aynı kaynağı ve hedefi belirtin ve bu, nesnenizdeki meta verilerinin güncellenmesinin etkisine sahiptir.

PUT /myObject HTTP/1.1 
Host: mybucket.s3.amazonaws.com 
x-amz-copy-source: /mybucket/myObject 
x-amz-metadata-directive: REPLACE 
x-amz-meta-myKey: newValue 
+6

, PUT isteği tüm orijinal üstbilgileri yeniden yazdığından, üstbilgi parametresindeki nesnenin İçerik türüne dahil etmeyi unutmayın. –

+0

Genel olarak, kopyalama işlemi, kaynak ve hedef aynı olduğunda sağladığınız meta verilerle tüm meta verileri yeniden yazar. Kopyalama isteklerinin aynı olmasını gerektiren, '' 'x-amz-metadata-directive''' için bkz. [Belgeler] (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) '' REPLACE' 'ifadesini belirtin.Mevcut kullanıcıyı veya S3 meta verilerini korumak istiyorsanız, varolan nesnenin meta verilerini almanız, girdileri eklemeniz/değiştirmeniz ve kopyaladığınız metadata güncelleştirilmiş meta verileri sağlamanız gerekir. – pauljm

10

Bu beta dışında bir satış komut durumu ve documented here olarak nesne kopyalayarak kullanılabilir. SDK'larında da mevcuttur. C# ile Örnek: amazon aws-sdk ile

var s3Client = new AmazonS3Client("publicKey", "privateKey"); 
var copyRequest = new CopyObjectRequest() 
        .WithDirective(S3MetadataDirective.REPLACE) 
        .WithSourceBucket("bucketName") 
        .WithSourceKey("fileName") 
        .WithDestinationBucket("bucketName") 
        .WithDestinationKey("fileName) 
        .WithMetaData(new NameValueCollection { { "x-amz-meta-yourKey", "your-value }, { "x-amz-your-otherKey", "your-value" } }); 
var copyResponse = s3Client.CopyObject(copyRequest); 
+0

Güncelleme için teşekkürler. :) – Scott

+0

@Scott merhaba, yeni API –

2

, ekstra başlıklara sahip bir copy_object yapmak varolan S3 Nesne için önbelleğe alma kontrolü başlıklarını ayarlamak için hile yapmak gibi görünüyor.

============================ =======================

<?php 
    error_reporting(-1); 
    require_once 'sdk.class.php'; 

    // UPLOAD FILES TO S3 
     // Instantiate the AmazonS3 class 
    $options = array("key" => "aws-key" , "secret" => "aws-secret") ; 


     $s3 = new AmazonS3($options); 
     $bucket = "bucket.3mik.com" ; 


    $exists = $s3->if_bucket_exists($bucket); 
    if(!$exists) { 
     trigger_error("S3 bucket does not exists \n" , E_USER_ERROR); 
    } 

    $name = "cows-and-aliens.jpg" ; 
    echo " change headers for $name \n" ; 
    $source = array("bucket" => $bucket, "filename" => $name); 
    $dest = array("bucket" => $bucket, "filename" => $name); 

    //caching headers 
    $offset = 3600*24*365; 
    $expiresOn = gmdate('D, d M Y H:i:s \G\M\T', time() + $offset); 
    $headers = array('Expires' => $expiresOn, 'Cache-Control' => 'public, max-age=31536000'); 

     $meta = array('acl' => AmazonS3::ACL_PUBLIC, 'headers' => $headers); 

    $response = $s3->copy_object($source,$dest,$meta); 
    if($response->isOk()){ 
     printf("copy object done \n"); 

    }else { 
     printf("Error in copy object \n"); 
    } 

?> 

==================== === x ============================================== ==

7

Bu PHP 2 için AWS SDK ile böyle yaparız:

<?php 
require 'vendor/autoload.php'; 

use Aws\Common\Aws; 
use Aws\S3\Enum\CannedAcl; 
use Aws\S3\Exception\S3Exception; 

const MONTH = 2592000; 

// Instantiate an S3 client 
$s3 = Aws::factory('config.php')->get('s3'); 
// Settings 
$bucketName = 'example.com'; 
$objectKey = 'image.jpg'; 
$maxAge = MONTH; 
$contentType = 'image/jpeg'; 

try { 
    $o = $s3->copyObject(array(
     'Bucket' => $bucketName, 
     'Key' => $objectKey, 
     'CopySource' => $bucketName . '/'. $objectKey, 
     'MetadataDirective' => 'REPLACE', 
     'ACL' => CannedAcl::PUBLIC_READ, 
     'command.headers' => array(
      'Cache-Control' => 'public,max-age=' . $maxAge, 
      'Content-Type' => $contentType 
     ) 
    )); 

    // print_r($o->ETag); 
} catch (Exception $e) { 
    echo $objectKey . ': ' . $e->getMessage() . PHP_EOL; 
} 
?> 
+0

ile, "Kullanılmayan veya artık kullanılamaz bir nesne kullanmak için bir girişim yapıldı." Bu SDK 2 ile benim için çalıştı. Teşekkürler bir demet. – mishka

1

Java da, bu

S3Object s3Object = amazonS3Client.getObject(bucketName, fileKey); 
ObjectMetadata metadata = s3Object.getObjectMetadata(); 
Map customMetaData = new HashMap(); 
customMetaData.put("yourKey", "updateValue"); 
customMetaData.put("otherKey", "newValue"); 
metadata.setUserMetadata(customMetaData); 

amazonS3Client.putObject(new PutObjectRequest(bucketName, fileId, s3Object.getObjectContent(), metadata)); 
deneyin

Ayrıca kopyalama nesnesini de deneyebilirsiniz. Burada bir nesne kopyalanırken meta veriler kopyalanmayacaktır. Orijinalin meta verilerini almanız ve kopyalamaya ayarlamanız gerekiyor. Bu yöntem daha eklemek ya da ben aynı ihtiyacı vardı bir Amazon S3 nesnesi

ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey); 
ObjectMetadata metadataCopy = new ObjectMetadata(); 
metadataCopy.addUserMetadata("yourKey", "updateValue"); 
metadataCopy.addUserMetadata("otherKey", "newValue"); 
metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue")); 

CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey) 
     .withSourceBucketName(bucketName) 
     .withSourceKey(fileKey) 
     .withNewObjectMetadata(metadataCopy); 

amazonS3Client.copyObject(request); 
1

meta verilerini güncellemek için tavsiye edilir ve böylece benim nodeJS çevre için yazdım.

https://github.com/newbreedofgeek/s3-bucket-cache-control

bunu test ettik ama lütfen olarak onun ilk riskli bir değişiklik gerekli özeni.

+0

basit görünüyor, tüm ayarları yaptım ve çalıştırmayı denedim ama şu hataları alıyorum: Cant tam .copyObject for image.jpg, hata ayrıntıları: {[AccessDenied: Erişim Reddedildi] message: 'Erişim Reddedildi', kod: 'AccessDenied', bölge: null, süresi: Per 28 Ocak GMT + 0530 (IST) 2016 10:51:24, RequestID: 'XXXXXXXXXX', extendedRequestId: 'XXXXXX', statusCode: 403, yinelenebilir: yanlış, retryDelay: Erişim (/s3-bucket-cache-control/node_modules/aws-sdk/lib/services/s3.js:329:35) Request.extractError de engellendi: 30} 'AccessDenied Ben ha ve IAM kullanıcısına verilen admin n s3fullacess, herhangi bir yardım? – thekosmix

0

Python'da bir yardım kodu.

import boto 
 

 
one_year = 3600*24*365 
 
cckey = 'cache-control' 
 
s3_connection = S3Connection() 
 
bucket_name = 'my_bucket' 
 
bucket = s3_connection.get_bucket(bucket_name validate=False) 
 

 

 
for key in bucket: 
 
    key_name = key.key 
 
    if key.size == 0: # continue on directories 
 
     continue 
 
    # Get key object 
 
    key = bucket.get_key(key_name) 
 

 
    if key.cache_control is not None: 
 
     print("Exists") 
 
     continue 
 

 
    cache_time = one_year 
 
    #set metdata 
 
    key.set_metadata(name=cckey, value = ('max-age=%d, public' % (cache_time))) 
 
    key.set_metadata(name='content-type', value = key.content_type) 
 
    # Copy the same key 
 
    key2 = key.copy(key.bucket.name, key.name, key.metadata, preserve_acl=True) 
 
    continue 
 

 

Açıklama: Kod yeni Mevcut bir anahtara meta ve sonra kopyaları aynı dosya ekler.

İlgili konular