2012-03-21 28 views
6

Tôi đang cập nhật các đối tượng hiện có trong thùng S3 của Amazon để đặt một số siêu dữ liệu. Tôi muốn đặt tiêu đề HTTP Expires cho từng đối tượng để xử lý tốt hơn các máy khách HTTP/1.0.Đặt tiêu đề hết hạn cho đối tượng S3 hiện có bằng AWS Java SDK

Chúng tôi đang sử dụng AWS Java SDK, cho phép siêu dữ liệu thay đổi thành đối tượng mà không cần tải lên lại nội dung đối tượng. Chúng tôi làm điều này bằng cách sử dụng CopyObjectRequest để sao chép một đối tượng cho chính nó. Lớp ObjectMetadata cho phép chúng tôi đặt Cache-Control, Content-Type và một số tiêu đề khác. Nhưng không phải tiêu đề Expires.

Tôi biết rằng S3 lưu trữ và phục vụ tiêu đề Expires cho các đối tượng PUT sử dụng API REST. Có cách nào để thực hiện điều này từ SDK Java không?

cập nhật để chỉ ra rằng chúng ta đang sử dụngCopyObjectRequest

Trả lời

6

Để thay đổi metadata của một đối tượng Amazon S3 hiện tại, bạn cần phải sao chép các đối tượng để bản thân và cung cấp metadata mới mong muốn một cách nhanh chóng, xem copyObject():

Theo mặc định, tất cả các đối tượng siêu dữ liệu cho nguồn đối tượng được sao chép vào đối tượng đích mới, trừ khi siêu dữ liệu đối tượng mới trong chỉ định CopyObjectRequest được chỉ định.

này có thể đạt được như vậy khoảng (đoạn từ đỉnh đầu của tôi, vì vậy hãy cẩn thận):

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

Xin lưu ý của đơn giản sau đây để bỏ lỡ, nhưng quan trọng copyObject() chế:

Danh sách kiểm soát Acccess Amazon S3 (ACL) là không phải được sao chép sang đối tượng mới. Đối tượng mới sẽ có mặc định Amazon S3 ACL, CannedAccessControlList.Private, trừ khi một đối tượng được cung cấp rõ ràng trong chỉ định CopyObjectRequest.

Đây là không được tính vào đoạn mã của tôi!

Chúc may mắn!

+0

Tôi nên giải thích rõ hơn là chúng tôi đang sử dụng 'CopyObjectRequest' để thực hiện việc này ngay bây giờ. Tôi đã cập nhật câu hỏi để phản ánh điều này. – bkirkbri

+0

'ObjectMetadata.setHeader' được đánh dấu là chỉ sử dụng nội bộ. Bạn đã sử dụng thành công chưa? Mã của chúng tôi chỉ được chạy một lần, vì vậy chúng tôi sẽ không cần phải lo lắng về nó sau này nếu Amazon thực hiện thay đổi. Nhưng YMMV. – bkirkbri

+0

Hmmh, tôi đã không nhận thức được rằng hạn chế thực sự, nhưng nhớ lại đã sử dụng 'Hết hạn: 'tại một số điểm một thời gian trở lại; Tôi có thể sai, mặc dù tôi thường sử dụng các SDK khác để tương tác với S3 (ví dụ C#/Python, mà chắc chắn hỗ trợ điều này) và có thể trộn lẫn lên - bản thân mã không khác với 'setXYZHeader()' khác phương pháp hiện tại (xem [ObjectMetadata.java] (https://github.com/amazonwebservices/aws-sdk-for-java/blob/master/src/main/java/com/amazonaws/services/s3/model/ObjectMetadata. java # L141)), do đó, các hạn chế sẽ được dựa trên một tác dụng phụ không nhìn thấy được, nếu có. –

1

Chúng tôi đang tìm kiếm một giải pháp tương tự và cuối cùng định cư cho max-age chỉ bộ nhớ cache kiểm soát. Và cuối cùng chúng tôi nhận ra rằng kiểm soát bộ nhớ cache hte ghi đè hết hạn ngay cả khi hết hạn là hạn chế hơn. Và anyways cache-control cũng đáp ứng được yêu cầu của chúng tôi.

+1

Cảm ơn. Bạn hoàn toàn chính xác 'Cache-Control' thay thế tiêu đề' Expires'. Tuy nhiên, chúng tôi muốn bao gồm nó cho các khách hàng HTTP/1.0 không tôn trọng 'Cache-Control'. – bkirkbri

Các vấn đề liên quan