Amazon S3'e bir grup resim yükledim ve şimdi bunlara bir Önbellek Denetimi üstbilgisi eklemek istiyorum.S3 nesnesindeki başlıkları tüm nesneyi indirmeden değiştirmek mümkün müdür?
Görüntüyü indirmeden başlık güncellenebilir mi? Öyleyse nasıl?
Amazon S3'e bir grup resim yükledim ve şimdi bunlara bir Önbellek Denetimi üstbilgisi eklemek istiyorum.S3 nesnesindeki başlıkları tüm nesneyi indirmeden değiştirmek mümkün müdür?
Görüntüyü indirmeden başlık güncellenebilir mi? Öyleyse nasıl?
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
, PUT isteği tüm orijinal üstbilgileri yeniden yazdığından, üstbilgi parametresindeki nesnenin İçerik türüne dahil etmeyi unutmayın. –
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
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);
Güncelleme için teşekkürler. :) – Scott
@Scott merhaba, yeni API –
, 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 ============================================== ==
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;
}
?>
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
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);
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.
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
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.
x-amz-metadata-yönergesel başlığı çalışmıyor. Her seferinde imza uyumsuzluğuyla sonuçlanır. Diğer tüm x-amz başlıkları iyi çalışıyor. –