2012-03-21 19 views
6

का उपयोग कर मौजूदा एस 3 ऑब्जेक्ट के लिए हेडर का समय समाप्त करता है मैं कुछ मेटाडेटा सेट करने के लिए अमेज़ॅन एस 3 बाल्टी में मौजूदा ऑब्जेक्ट्स अपडेट कर रहा हूं। HTTP/1.0 क्लाइंट को बेहतर तरीके से संभालने के लिए मैं प्रत्येक ऑब्जेक्ट के लिए HTTP Expires शीर्षलेख सेट करना चाहता हूं।सेट एडब्ल्यूएस जावा एसडीके

हम AWS Java SDK का उपयोग कर रहे हैं, जो ऑब्जेक्ट सामग्री को फिर से अपलोड किए बिना किसी ऑब्जेक्ट में मेटाडेटा परिवर्तनों की अनुमति देता है। हम ऑब्जेक्ट को कॉपी करने के लिए CopyObjectRequest का उपयोग करके ऐसा करते हैं। ObjectMetadata वर्ग हमें Cache-Control, Content-Type और कई अन्य शीर्षलेख सेट करने की अनुमति देता है। लेकिन Expires शीर्षलेख नहीं।

मुझे पता है कि एस 3 स्टोर्स और आरईएसटी एपीआई का उपयोग कर ऑब्जेक्ट्स के लिए Expires शीर्षलेख परोसता है। जावा एसडीके से ऐसा करने का कोई तरीका है?

संकेत मिलता है कि हम प्रयोग कर रहे हैंCopyObjectRequest

उत्तर

6

एक मौजूदा Amazon S3 वस्तु की metadata बदलने के लिए, आप अपने आप को वस्तु कॉपी और मक्खी पर वांछित नया मेटाडाटा उपलब्ध कराने की आवश्यकता, copyObject() देखें:

डिफ़ॉल्ट रूप से, स्रोत के लिए सभी वस्तु मेटाडाटा ऑब्जेक्ट की प्रतिलिपि पर नई गंतव्य ऑब्जेक्ट की प्रतिलिपि बनाई गई है, जब तक कि में निर्दिष्ट ऑब्जेक्ट मेटाडेटा निर्दिष्ट CopyObjectRequest प्रदान नहीं किया जाता है।

यह बहुत लगभग की तरह हासिल किया जा सकता (मेरे सिर के ऊपर से टुकड़ा है, इसलिए सावधान रहना):

AmazonS3 s3 = new AmazonS3Client(); 

String bucketName = "bucketName "; 
String key = "key.txt"; 
ObjectMetadata newObjectMetadata = new ObjectMetadata(); 
// ... whatever you desire, e.g.: 
newObjectMetadata.setHeader("Expires", "Thu, 21 Mar 2042 08:16:32 GMT"); 

CopyObjectRequest copyObjectRequest = new CopyObjectRequest() 
       .WithSourceBucketName(bucketName) 
       .WithSourceKey(key) 
       .WithDestinationBucket(bucketName) 
       .WithDestinationKey(key) 
       .withNewObjectMetadata(newObjectMetadata); 

s3.copyObject(copyObjectRequest); 

कृपया आसान निम्नलिखित याद करने के बारे में पता हो सकता है, लेकिन महत्वपूर्ण copyObject() बाधा:

अमेज़न S3 पर पहुंचने के नियंत्रण सूची (एसीएल) नहीं नई वस्तु को कॉपी किया है। नई ऑब्जेक्ट में डिफ़ॉल्ट अमेज़ॅन एस 3 एसीएल, डिब्बाबंदएक्सकंट्रोल लिस्ट। प्राइवेट होगा, जब तक कि कोई स्पष्ट रूप से निर्दिष्ट CopyObjectRequest में प्रदान नहीं किया जाता है।

यह नहीं मेरे कोड खंड में अभी तक के लिए जिम्मेदार है!

शुभकामनाएं!

+0

मुझे बेहतर समझाया जाना चाहिए कि हम इसे करने के लिए 'CopyObjectRequest' का उपयोग कर रहे हैं। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट किया है। – bkirkbri

+0

'ऑब्जेक्टमैटाडाटा.सेट हैडर' को केवल आंतरिक उपयोग के रूप में चिह्नित किया गया है। क्या आपने इसका सफलतापूर्वक उपयोग किया है? हमारा कोड केवल एक बार चलने जा रहा है, इसलिए अमेज़ॅन में बदलाव होने पर हमें इसके बारे में चिंता करने की आवश्यकता नहीं होगी। लेकिन वाईएमएमवी। – bkirkbri

+0

हम्म, मुझे वास्तव में उस प्रतिबंध के बारे में पता नहीं था, लेकिन कुछ समय पहले 'समाप्त हो गया' का उपयोग करने की याद आती है; हालांकि मैं गलत हो सकता हूं, हालांकि मैं अक्सर एस 3 के साथ बातचीत करने के लिए अन्य एसडीके का उपयोग करता हूं (उदाहरण के लिए सी #/पायथन, जो निश्चित रूप से इसका समर्थन करता है) और इसे मिश्रित कर सकता था - कोड स्वयं अन्य 'setXYZHeader() ' वर्तमान में विधियां (देखें [ऑब्जेक्टमैटाडाटा.जावा] (https://github.com/amazonwebservices/aws-sdk-for-java/blob/master/src/main/java/com/amazonaws/services/s3/model/ObjectMetadata। जावा # एल 141)), इसलिए प्रतिबंध किसी भी दृश्यमान दुष्प्रभाव पर आधारित होगा, यदि कोई हो। –

1

हम एक ऐसी ही समाधान के लिए देख रहे थे और अंत में अधिकतम उम्र कैश-नियंत्रण के निर्देश के लिए बसे अपडेट किया गया। और हमें अंततः एहसास हुआ कि एचटीई कैश-कंट्रोल समाप्त होने पर भी समाप्त हो जाता है। और वैसे भी कैश-कंट्रोल भी हमारी आवश्यकता को पूरा करता है।

+1

धन्यवाद। आप बिल्कुल सही हैं 'कैश-कंट्रोल' 'एक्सपियर' हेडर का अधिग्रहण करता है। फिर भी, हम इसे HTTP/1.0 क्लाइंट्स के लिए शामिल करना चाहते हैं जो 'कैश-कंट्रोल' का सम्मान नहीं करते हैं। – bkirkbri

संबंधित मुद्दे