獲取對象列表
功能說明
您可以使用 listObjects 接口列舉對象,每次最多返回1000個對象。
代碼示例
以下代碼展示如何簡單獲取對象列表:
public void listObjects1() throws AmazonClientException {
System.out.println("listObjects");
String bucket = "<your-bucket-name>";
ListObjectsRequest request = new ListObjectsRequest();
request.setBucketName(bucket);
// 過濾前綴
//request.setPrefix("abc/");
ObjectListing objects = s3Client.listObjects(request);
for (S3ObjectSummary object : objects.getObjectSummaries()) {
System.out.println(" - " + object.getKey());
}
}如果 list 大于1000,則返回的結果中 isTruncated 為true,通過返回的 nextMarker 標記可以作為下次讀取的起點。列舉所有對象示例代碼如下:
public void listObjects2() throws AmazonClientException {
System.out.println("listObjects");
String bucket = "<your-bucket-name>";
String nextMarker = null;
ObjectListing objectListing;
do {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.withBucketName(bucket).withMarker(nextMarker);
objectListing = s3Client.listObjects(listObjectsRequest);
for (S3ObjectSummary s3ObjectSummary: objectListing.getObjectSummaries()) {
System.out.println(s3ObjectSummary.getKey());
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
}若對象路徑上包含特殊字符(如中文、單引號、雙引號等),需要指定編碼(URL編碼)。示例代碼如下:
public void listObjects3() {
System.out.println("listObjects");
String bucket = "<your-bucket-name>";
String nextMarker = null;
ObjectListing objectListing;
do {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.withBucketName(bucket).withMarker(nextMarker);
listObjectsRequest.setEncodingType("url"); // 指定URL編碼
objectListing = s3Client.listObjects(listObjectsRequest);
List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for (S3ObjectSummary s3ObjectSummary : objectListing.getObjectSummaries()) {
String keyName = null;
try {
keyName = URLDecoder.decode(s3ObjectSummary.getKey(), StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
System.out.println(keyName);
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
}請求參數
ListObjectsRequest 中可設置的參數如下:
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| bucketName | String | 設置桶名稱 | 是 |
| encodingType | String | 用于設置返回對象的字符編碼類型 | 否 |
| marker | String | 指定列出對象讀取對象的起點 | 否 |
| maxKeys | int | 設置response中返回對象的數量,默認值和最大值均為1000 | 否 |
| prefix | String | 限定列舉 objectKey 匹配前綴 prefix 的對象 | 否 |
| delimiter | String | 與prefix參數一起用于對對象key進行分組的字符。所有key包含指定的prefix且第一次出現Delimiter字符的對象作為一組。如果沒有指定prefix參數,按delimiter對所有對象key進行分割,多個對象分割后從對象key開始到第一個delimiter之間相同的部分形成一組 | 否 |
返回結果
返回的 ObjectListing 屬性如下:
| 屬性名 | 類型 | 說明 |
|---|---|---|
| commonPrefixes | List<String> | 當請求中設置了delimiter和prefix屬性時,所有包含指定的Prefix且第一次出現delimiter字符的對象key作為一組 |
| objectSummaries | List<S3ObjectSummary> | 對象數據,每個對象包含了Entity Tag、Key、LastModifiedTime、Owner和Size等信息。 |
| delimiter | String | 與請求中設置的delimiter一致 |
| encodingType | String | 返回對象key的字符編碼類型 |
| isTruncated | boolean | 當為false時表示返回結果中包含了全部符合本次請求查詢條件的對象信息,否則只返回了數量為MaxKeys個的對象信息 |
| marker | String | 與請求中設置的Marker一致 |
| maxKeys | int | 本次返回結果中包含的對象數量的最大值 |
| bucketName | String | 執行本操作的桶名稱 |
| nextMarker | String | 當返回結果中的IsTruncated為true時,可以使用NextMarker作為下次查詢的Marker,繼續查詢出下一部分的對象信息 |
| prefix | String | 與請求中設置的prefix一致 |
上傳對象
功能說明
您可以使用 putObject 接口上傳對象。如果對同一個對象同時發起多個上傳請求,最后一次完成的請求將覆蓋之前所有請求的上傳的對象。可以通過設置請求頭部中的Content-MD5字段來保證數據被完整上傳,如果上傳的數據不能通過MD5校驗,該操作將返回一個錯誤提示。用戶可以通過比較上傳對象后獲得的ETag 與原文件的MD5值是否相等來確認上傳操作是否成功。
上傳對象操作在上傳對象時可以在請求里攜帶HTTP協議規定的6個請求頭:Cache-Control、Expires、Content-Encoding、Content-Disposition、Content-Type、Content-Language。如果上傳對象的請求設置了這些請求頭,服務端會直接將這些頭域的值保存下來。這6個值也可以通過修改對象元數據操作進行修改。在該對象被下載或者執行HeadObject操作的時候,這些保存的值將會被設置到對應的HTTP頭域中返回客戶端。
PutObject操作可以上傳最大不超過5GB的文件,超過5GB的文件可以通過分片上傳操作上傳到對象存儲(融合版)服務,對象key的命名使用UTF-8編碼,長度必須在1~1023字節之間,不能以[/][\]字符開頭。
代碼示例
文件上傳
public void putObject1() throws AmazonClientException {
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String localPath = "<your-local-path>";
PutObjectResult ret = s3Client.putObject(bucket, key, new File(localPath));
System.out.println("putObject: " + ret.getETag());
}流式上傳
public void putObject2() throws AmazonClientException {
System.out.println("putObject");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String content = "1234";
byte[] contentBytes = content.getBytes();
InputStream is = new ByteArrayInputStream(contentBytes);
ObjectMetadata meta = new ObjectMetadata();
//meta.setContentMD5(md5Base64(content));
//meta.setContentLength(4);
//meta.setContentType("text/plain");
PutObjectRequest req = new PutObjectRequest(bucket, key, is, meta);
// 設置acl
req.setCannedAcl(CannedAccessControlList.PublicRead);
// 設置存儲類型
//req.setStorageClass(StorageClass.StandardInfrequentAccess);
// rate 上傳限速,單位KB
//req.putCustomRequestHeader("x-amz-limit", String.format("rate=%d", 10));
PutObjectResult ret = s3Client.putObject(req);
System.out.println("putObject: " + ret.getETag());
}
?
public String md5Base64(String data) {
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(data.getBytes());
BASE64Encoder be = new BASE64Encoder();
return be.encode(md5);
} catch (NoSuchAlgorithmException e) {}
return "";
}請求參數
PutObjectRequest 可設置的參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱 | 是 |
| key | String | 上傳文件到對象存儲(融合版)服務后對應的key。PutObject操作支持將文件上傳至文件夾,如需要將對象上傳至"/folder"文件下,只需要設置Key="/folder/{exampleKey}"即可 | 是 |
| file | File | 上傳的本地文件 | 文件上傳必須 |
| inputStream | InputStream | 流式上傳的Stream | 流式上傳必須 |
| cannedAcl | CannedAccessControlList | 配置上傳對象的預定義的標準ACL信息,詳細說明見 設置對象訪問權限 一節 | 否 |
| storageClass | StorageClass | 配置上傳對象的存儲類型,包括標準類型STANDARD、低頻類型STANDARD_IA以及歸檔類型GLACIER | 否 |
| accessControlList | AccessControlList | 配置上傳對象的詳細ACL信息,詳細說明見設置 對象訪問權限 一節 | 是 |
| objectMetadata | ObjectMetadata | 對象的元數據信息 | 否 |
| tagging | ObjectTagging | 對象的標簽信息 | 否 |
您可以在上傳對象時通過 ObjectMetadata 設置對象元數據。對象可設置的元數據如下:
| 方法 | 作用 |
|---|---|
| ObjectMetadata.setContentType | 設置HTTP/HTTPS請求頭部中的 Content-Type |
| ObjectMetadata.setContentLanguage | 設置HTTP/HTTPS請求頭部中的 Content-Language |
| ObjectMetadata.setCacheControl | 設置HTTP/HTTPS請求頭部中的 Cache-Control |
| ObjectMetadata.setContentDisposition | 設置HTTP/HTTPS請求頭部中的 Content-Disposition |
| ObjectMetadata.setContentEncoding | 設置HTTP/HTTPS請求頭部中的 Content-Encoding |
| ObjectMetadata.setContentLength | 設置HTTP/HTTPS請求頭部中的 Content-Length,設置請求body的長度(單位:字節) |
| ObjectMetadata.setContentMD5 | 對象數據的MD5值(經過 Base64編碼),提供給服務端校驗數據完整性。 |
返回結果
PutObjectResult 返回的屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| ETag | String | 上傳對象后對應的Entity Tag |
| VersionId | String | 上傳對象后相應的版本Id |
下載對象
功能說明
您可以使用 getObject 接口下載對象。
代碼示例
public void getObject() throws AmazonClientException {
System.out.println("getObject");
try {
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
long start = 0, end = 10;
GetObjectRequest req = new GetObjectRequest(bucket, key);
req.setRange(start, end); // 設置對象內容的范圍,單位字節
// 覆蓋返回header
// ResponseHeaderOverrides header = new ResponseHeaderOverrides();
// header.setContentDisposition("attachment; filename=testing.txt");
// req.setResponseHeaders(header);
?
S3Object object = s3Client.getObject(req);
?
S3ObjectInputStream s3is = object.getObjectContent();
ObjectMetadata meta = object.getObjectMetadata();
System.out.println("getobject: meta mymd5: " + meta.getUserMetaDataOf("mymd5"));
String content = IOUtils.toString(s3is);
System.out.println("getobject: " + content);
System.out.println("getobject header: " + object.getObjectMetadata().getContentDisposition());
} catch (IOException e) {
e.printStackTrace();
}
}請求參數
GetObjectRequest 參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱。 | 是 |
| key | String | 對象的key。 | 是 |
| range | long, long | 下載對象指定范圍內的數據(單位:字節),setRange(start, end) 表示前2字節的數據,詳情請參見 | 否 |
| versionId | String | 當bucket開啟版本控制的時候,用于指定獲取指定版本的對象數據,當不指定該參數的時候,默認獲取最新版本的對象數據 | 否 |
| responseHeaders | ResponseHeaderOverrides | 重寫HTTP/HTTPS響應頭信息 | 否 |
| modifiedSinceConstraint | Date | 如果指定的時間早于實際修改時間,則正常傳送。否則返回錯誤 | 否 |
| unmodifiedSinceConstraint | Date | 如果傳入參數中的時間等于或者晚于文件實際修改時間,則正常傳輸文件;否則返回錯誤 | 否 |
| matchingETagConstraints | List<String> | 如果傳入的ETag和Object的 ETag匹配,則正常傳輸;否則返回錯誤 | 否 |
| nonmatchingEtagConstraints | List<String> | 如果傳入的ETag值和Object的ETag不匹配,則正常傳輸;否則返回錯誤 | 否 |
通過 ResponseHeaderOverrides 可重寫部分HTTP/HTTPS響應頭信息。可重寫的響應頭信息見下表:
| 參數 | 類型 | 作用 |
|---|---|---|
| contentType | String | 重寫HTTP/HTTPS響應中的 Content-Type |
| contentLanguage | String | 重寫HTTP/HTTPS響應中的 Content-Language |
| expires | String | 重寫HTTP/HTTPS響應中的 Expires |
| cacheControl | String | 重寫HTTP/HTTPS響應中的 Cache-Control |
| contentDisposition | String | 重寫HTTP/HTTPS響應中的 Content-Disposition |
| contentEncoding | String | 重寫HTTP/HTTPS響應中的 Content-Encoding |
返回結果
返回的 S3Object 屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| objectContent | S3ObjectInputStream | 對象的數據流 |
| metadata | ObjectMetadata | 對象的元數據 |
| taggingCount | int | 對象標簽的數量 |
| bucket | String | 對象所屬的桶 |
| key | String | 對象key |
復制對象
功能說明
您可以使用 copyObject 接口復制對象,您需要設置復制的對象名,所在的桶以及目標桶和對象名。
代碼示例
復制一個對象
public void copyObject() throws AmazonClientException {
String destBucketName = "<your-bucket-name>";
String destObjectKey = "<your-object-key>";
String sourceBucketName = "<source-bucket-name>";
String sourceObjectKey = "<source-object-key>";
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.setContentType("text/json");
CopyObjectRequest request = new CopyObjectRequest(sourceBucketName, sourceObjectKey, destBucketName, destObjectKey);
// request.setStorageClass(StorageClass.Standard); // 設置對象的存儲類型
// 如果源對象是歸檔存儲類型,需要先解凍對象
// ObjectUnfreezeSDK unfreezeSDK = new ObjectUnfreezeSDK(accessKey, secretKey, endPoint);
// System.out.println(unfreezeSDK.unfreeze(oriBucket, oriKey));
// Thread.sleep(60000); // 等待解凍完成
CopyObjectResult result = s3Client.copyObject(request);
System.out.println("CopyObject success" + result.getETag());
}媒體存儲Java SDK沒有直接修改對象元數據的方法,上傳文件之后就不能修改了,可以使用 copyObject 接口修改對象元數據,注意:源bucket和目的bucket一致,源key和目的key一致。
public void changeMetadataViaCopyObject() throws AmazonClientException {
String bucket = "<your-bucket-name>";
String sourceObjectKey = "<your-object-key>";
String destObjectKey = "<your-object-key>"; // 復制到原來的key
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.setContentType("text/json");
CopyObjectRequest request = new CopyObjectRequest(bucket, sourceObjectKey, bucket, destObjectKey)
.withNewObjectMetadata(metadataCopy);
CopyObjectResult result = s3Client.copyObject(request);
System.out.println("changeMetadataViaCopyObject success, Etag:" + result.getETag());
}文件比較大(超過1GB)的情況下,直接使用copyObject 可能會出現超時,需要使用分片復制的方式進行文件復制,TransferManager封裝了分片復制的接口,可以用于復制文件,具體示例請參考 分片上傳融合接口 中的使用 TransferManager 進行分片復制部分。
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 源桶 | 是 |
| oriKey | String | 源對象key | 是 |
| destBucket | String | 目的桶 | 是 |
| destKey | String | 目的對象key | 是 |
| storageClass | StorageClass | 配置目的對象的存儲類型,包括標準類型STANDARD、低頻類型STANDARD_IA以及歸檔類型GLACIER | 否 |
返回結果
返回的 CopyObjectRequest 屬性
| 參數 | 類型 | 說明 |
|---|---|---|
| ETag | string | 對象的唯一標簽 |
刪除對象
功能說明
您可以使用 deleteObject 接口刪除單個對象。
代碼示例
public void deleteObject() throws AmazonClientException {
System.out.println("deleteObject");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
s3Client.deleteObject(bucket, key);
System.out.println("deleteObject success");
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名 | 是 |
| key | String | 對象名 | 是 |
批量刪除對象
功能說明
您可以使用 deleteObjects 接口批量刪除多個對象,提供兩種返回模式:詳細(verbose)模式和簡單(quiet)模式,詳細模式包括成功與失敗的結果,簡單模式只返回失敗的結果,默認為詳細模式。
代碼示例
public void deleteObjects() throws AmazonClientException {
System.out.println("deleteObjects");
String bucket = "<your-bucket-name>";
String [] keys = {"<your-object-key1>", "<your-object-key2>"};
DeleteObjectsRequest request = new DeleteObjectsRequest(bucket);
request.withKeys(keys);
DeleteObjectsResult ret = s3Client.deleteObjects(request);
List<DeleteObjectsResult.DeletedObject> list = ret.getDeletedObjects();
for (DeleteObjectsResult.DeletedObject del: list){
System.out.println("deleteObjects: " + del.getKey());
}
}請求參數
DeleteObjectsRequest 可設置的參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱 | 是 |
| keys | String[] | 要刪除的對象key | 是 |
返回結果
返回的 List<DeleteObjectsResult.DeletedObject> 可獲取被刪除的對象 key
獲取對象元數據
功能說明
您可以使用 getObjectMetadata 接口獲取對象元數據。getObjectMatadata 操作的請求參數與getObject一樣,但是 getObjectMetadata 返回的http響應中沒有對象數據。
代碼示例
public void getObjectMetadata() throws AmazonClientException {
System.out.println("getObjectMetadata");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
ObjectMetadata ret = s3Client.getObjectMetadata(bucket, key);
System.out.println("getObjectMetadata content-length: " + ret.getContentLength());
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名 | 是 |
| key | String | 對象名 | 是 |
返回結果
返回的 ObjectMetadata 屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| contentLength | long | 本次請求返回對象數據的大小(單位:字節) |
| contentType | String | 對象文件格式的標準MIME類型 |
| eTag | String | 對象的Entity Tag |
| lastModified | Date | 最近一次修改對象的時間。 |
| versionId | String | 對象最新的版本ID。 |
設置對象訪問權限
功能說明
與桶訪問權限類似,對象訪問權限同樣具有 CannedAccessControlList 與 AccessControlList 兩種。需要注意的是,對象的訪問優先級要高于桶訪問權限。比如桶訪問權限是 private,但是對象訪問權限是 public read,則所有用戶都可以訪問該對象。默認情況下,只有對象的擁有者才能訪問該對象,即對象的訪問權限默認是 private。設置對象ACL操作需要具有對象的WRITE_ACP權限。
代碼示例
CannedAccesssControlList
CannedAccesssControlList 格式的對象訪問權限包含了:Private(私有讀寫),PublicRead(公共讀私有寫),PublicReadWrite(公共讀寫)。使用 CannedAccesssControlList 設置桶的訪問權限示例代碼如下:
public void setObjectAcl1() throws AmazonClientException {
System.out.println("setObjectAcl");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
?
s3Client.setObjectAcl(bucket, key, CannedAccessControlList.PublicRead);
System.out.println("setObjectAcl success");
}AccessControlList
使用 AccessControlList 設置對象訪問權限時,可以設置特定用戶對象的訪問權限。使用AccesssControlList設置對象的權限示例代碼如下:
public void setObjectAcl2() throws AmazonClientException {
System.out.println("setObjectAcl");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
// 增加用戶exampleuser的Write權限
AccessControlList controlList = s3Client.getObjectAcl(bucket, key);
CanonicalGrantee canonicalGrantee = new CanonicalGrantee("exampleuser");//開啟用戶exampleuser的Write權限
controlList.grantPermission(canonicalGrantee,Permission.Write);
?
s3Client.setObjectAcl(bucket, key, controlList);
System.out.println("setObjectAcl success");
}請求參數
CannedAccesssControlList
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象key | 是 |
| CannedAccessControlList | CannedAccessControlList | 對象權限 | 是 |
關于 CannedAccessControlList 的說明:
| 參數 | 說明 |
|---|---|
| CannedAccessControlList.Private | 私有讀寫 |
| CannedAccessControlList.PublicRead | 公共讀私有寫 |
| CannedAccessControlList.PublicReadWrite | 公共讀寫 |
AccessControlList
使用 AccessControlList 設置桶訪問權限時,可以設置特定用戶對桶的訪問權限。桶的 AccessControlList 權限如下表:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象key | 是 |
| controlList | AccessControlList | 對象權限 | 是 |
在 AccessControlList 中可通過 grantAllPermission 傳入 Grant 設置權限,Grant 中關于Permission說明如下:
| 參數 | 說明 |
|---|---|
| Permission.Read | 允許讀取對象數據和元數據 |
| Permission.Write | 不可作用于對象 |
| Permission.ReadAcp | 允許獲取對象的ACL信息 |
| Permission.WriteAcp | 允許修改對象的ACL信息 |
| Permission.FullControl | 獲得READ、READ_ACP、WRITE_ACP權限 |
獲取對象訪問權限
功能說明
您可以使用 getObjectAcl 接口獲取對象訪問的權限。
代碼示例
public void getObjectAcl() throws AmazonClientException {
System.out.println("getObjectAcl");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
AccessControlList ret = s3Client.getObjectAcl(bucket, key);
List<Grant> grants = ret.getGrantsAsList();
System.out.println("getObjectAcl: owner=" + ret.getOwner());
for (Grant grant: grants){
System.out.println("getObjectAcl: grantee=" + grant.getGrantee().getIdentifier()
+ ", permission=" + grant.getPermission());
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 對象所屬桶的名稱 | 是 |
| key | String | 對象的key | 是 |
| versionId | String | 設置標簽信息的對象的版本Id | 否 |
返回結果
返回的 AccessControlList 中包含的屬性:
| 參數 | 類型 | 說明 |
|---|---|---|
| owner | Owner | 對象的owner信息 |
| grants | List<Grant> | grants 授權信息,包含了每個用戶與其權限Permission |
關于 AccessControlList 中的訪問權限說明可參考 設置對象訪問權限 一節。
設置對象標簽
功能說明
您可以使用setObjectTagging接口為對象設置標簽。標簽是一個鍵值對,每個對象最多可以有10個標簽。bucket的擁有者默認擁有給bucket中的對象設置標簽的權限,并且可以將權限授予其他用戶。每次執行PutObjectTagging操作會覆蓋對象已有的標簽信息。每個對象最多可以設置10個標簽,標簽Key和Value區分大小寫,并且Key不可重復。每個標簽的Key長度不超過128字節,Value長度不超過256字節。SDK通過HTTP header的方式設置標簽且標簽中包含任意字符時,需要對標簽的Key和Value做URL編碼。設置對象標簽信息不會更新對象的最新更改時間。
代碼示例
public void setObjectTagging() throws AmazonClientException{
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
List<Tag> tagList = new ArrayList<>();
tagList.add(new Tag("<your-tag-key1>", "<your-tag-value1>"));
tagList.add(new Tag("<your-tag-key2>", "<your-tag-value2>"));
?
ObjectTagging config = new ObjectTagging(tagList);
SetObjectTaggingRequest request = new SetObjectTaggingRequest(bucket, key, config);
s3Client.setObjectTagging(request);
System.out.println("setObjectTagging success");
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象key | 是 |
| tagging | ObjectTagging | 設置的標簽信息,包含了一個Tag結構體的數組,每個Tag以Key-Value的形式說明了標簽的內容 | 是 |
| versionId | String | 設置標簽信息的對象的版本Id | 否 |
獲取對象標簽
功能說明
您可以使用getObjectTagging接口獲取對象標簽。
代碼示例
public void getObjectTagging() throws AmazonClientException{
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
GetObjectTaggingRequest request = new GetObjectTaggingRequest(bucket, key);
GetObjectTaggingResult config = s3Client.getObjectTagging(request);
for (Tag tag: config.getTagSet()){
System.out.println("getObjectTagging success, tags: " + tag.getKey() + ":" + tag.getValue());
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象key | 是 |
| versionId | String | 設置標簽信息的對象的版本Id | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| tagging | ObjectTagging | 設置的標簽信息,包含了一個Tag結構體的數組,每個Tag以Key-Value的形式說明了標簽的內容 |
刪除對象標簽
功能說明
您可以使用deleteObjectTagging接口刪除對象標簽。
代碼示例
public void deleteObjectTagging() throws AmazonClientException{
System.out.println("deleteObjectTagging");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
DeleteObjectTaggingRequest request = new DeleteObjectTaggingRequest(bucket, key);
s3Client.deleteObjectTagging(request);
System.out.println("deleteObjectTagging success");
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象key | 是 |
| versionId | String | 設置標簽信息的對象的版本Id | 否 |
生成預簽名上傳URL
功能說明
您可以利用 GeneratePresignedUrl 接口為一個對象生成一個上傳的預簽名URL鏈接。
代碼示例
生成上傳對象的預簽名 URL:
public String generatePutPresignedUrl() throws AmazonClientException {
System.out.println("generatePutPresignedUrl");
String key = "ExampleObject.txt";
?
Date now = new Date();
Calendar newTime = Calendar.getInstance();
newTime.setTime(now);
newTime.add(Calendar.SECOND, 900);
Date expire = newTime.getTime();
?
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key, HttpMethod.PUT);
request.withExpiration(expire);
URL ret = s3Client.generatePresignedUrl(request);
System.out.println("generatePutPresignedUrl: " + ret);
return ret.toString();
}生成對應的上傳預簽名URL后,可以直接通過該URL上傳對象:
public void putObjUsingPresignedUrl(String presignedUrl, File file) throws IOException {
System.out.println("開始通過預簽名 URL 上傳文件...");
HttpURLConnection connection = (HttpURLConnection) new URL(presignedUrl).openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
?
// 上傳文件內容
try (OutputStream outputStream = connection.getOutputStream();
FileInputStream inputStream = new FileInputStream(file)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
?
// 檢查上傳響應狀態
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
System.out.println("文件上傳成功。");
} else {
System.out.println("文件上傳失敗,狀態碼: " + responseCode);
}
}
請求參數
| 參數 | 類型 | 描述 |
|---|---|---|
| bucketName | String | 桶名 |
| key | String | 對象名 |
| expiration | Date | 過期時間,默認900秒 |
| method | HttpMethod | HTTP 方法,設置為 PUT 以生成上傳 URL,默認為GET |
返回結果
生成對應的預簽名上傳 URL,該鏈接允許用戶在指定的時間內直接將對象上傳到媒體存儲存儲桶。
生成預簽名下載URL
功能說明
您可以利用 GeneratePresignedUrl 接口為一個對象生成一個預簽名的URL鏈接。
代碼示例
生成下載對象的預簽名 URL:
public void generateGetPresignedUrl() throws AmazonClientException {
System.out.println("generateGetPresignedUrl");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
?
Date now = new Date();
Calendar newTime = Calendar.getInstance();
newTime.setTime(now);
newTime.add(Calendar.SECOND, 900);
Date expire = newTime.getTime();
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key, HttpMethod.GET);
request.withExpiration(expire);
URL ret = s3Client.generatePresignedUrl(request);
System.out.println("generateGetPresignedUrl: " + ret);
}生成對應的下載預簽名URL后,可以直接通過該URL下載對象:
public void getObjUsingPresignedUrl(String presignedUrl, String downloadPath) throws IOException {
System.out.println("開始通過預簽名 URL 下載文件...");
HttpURLConnection connection = (HttpURLConnection) new URL(presignedUrl).openConnection();
connection.setRequestMethod("GET");
?
// 檢查下載響應狀態
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (InputStream inputStream = connection.getInputStream();
FileOutputStream outputStream = new FileOutputStream(downloadPath)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
System.out.println("文件下載成功。");
}
} else {
System.out.println("文件下載失敗,狀態碼: " + responseCode);
}
}請求參數
| 參數 | 類型 | 描述 |
|---|---|---|
| bucketName | String | 桶名 |
| key | String | 對象名 |
| expiration | Date | 過期時間,默認900秒 |
| method | HttpMethod | HTTP 方法,默認為GET,生成下載 URL |
返回結果
生成對應的預簽名下載 URL,該鏈接允許用戶在指定的時間內直接從媒體存儲下載對象。
Post上傳
功能說明
ObjectPostSDK接口為一個指定對象生成一個支持post方式上傳文件的參數集合,可以在前端使用post form-data的方式上傳文件。ObjectPostSDK實現請查看 。
代碼示例
public void postObject() throws Exception {
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String localFilePath = "<your-local-file-path>"";
?
ObjectPostSDK.PostObjectPolicy policy = new ObjectPostSDK.PostObjectPolicy(900);
policy.addEqualCondition("acl", "public-read");
ObjectPostSDK.PostObjectData data = sdk.generatePostObjectData(bucket, key, policy);
System.out.println("Policy:" + policy.getPolicy());
Map<String, String> formFields = data.getFormFields();
formFields.put("acl", "public-read");
for (Entry<String, String> entry: formFields.entrySet()){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
// String storageClass = StorageClass.Standard.toString(); // 設置對象存儲類型
// String ret = formUpload(data.getUrl(), data.getFormFields(), localFilePath, storageClass);
String ret = formUpload(data.getUrl(), data.getFormFields(), localFilePath);
System.out.println("Post Object [" + objectKey + "] to bucket [" + bucket + "]");
System.out.println("post response:" + ret);
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | 字符串 | bucket的名稱 | 是 |
| key | 字符串 | 對象的key | 是 |
| expires | 整型數 | 超時時間(秒) | 否,默認900秒 |
| storageClass | 字符串 | 配置上傳對象的存儲類型,包括標準類型STANDARD、低頻類型STANDARD_IA以及歸檔類型GLACIER | 否,默認為STANDARD |
前端使用方式如下:
<form action="<data.url>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="Policy" value="<data.fields['Policy']>" />
<input type="hidden" name="X-Amz-Algorithm" value="<data.fields['X-Amz-Algorithm']>" />
<input type="hidden" name="X-Amz-Credential" value="<data.fields['X-Amz-Credential']>" />
<input type="hidden" name="X-Amz-Date" value="<data.fields['X-Amz-Date']>" />
<input type="hidden" name="X-Amz-Signature" value="<data.fields['X-Amz-Signature']>" />
<input type="hidden" name="bucket" value="<data.fields['bucket']>" />
<input type="hidden" name="key" value="<data.fields['key']>" />
?
<input type="file" name="file" value="" />
<input type="submit" value="Submit" />
</form>追加寫
功能說明
PutObject可以對桶中的一個對象進行追加寫操作,如果該對象已經存在,執行該操作則向文件末尾追加內容,否則將創建對象。
通過Append操作創建的Object類型為Appendable,而通過PutObject操作上傳的Object的類型是Normal。對Appendable類型的對象進行普通上傳操作之后會覆蓋原有對象的內容并且將其類型設置為Normal。
Append操作僅可以在未開啟版本控制的桶中執行,如果桶的版本控制狀態為啟用(Enabled)或者暫停(Suspended)狀態將不支持Append操作。
代碼示例
public void putObjectAppend() throws AmazonServiceException {
System.out.println("putObjectAppend");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
?
long contentLength = 0;
try {
// 獲取原始文件長度,也可以使用業務自己的接口獲取
ObjectMetadata meta = s3Client.getObjectMetadata(bucket, key);
contentLength = meta.getContentLength();
} catch (AmazonServiceException e){
?
}
?
String content = "123";
byte[] contentBytes = content.getBytes();
InputStream is = new ByteArrayInputStream(contentBytes);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("text/plain");
?
AppendObjectRequest req = new AppendObjectRequest(bucket, key, is, metadata);
// req.setStorageClass(StorageClass.Standard); // 設置對象的存儲類型
req.setPosition(contentLength);
AppendObjectResult ret = s3Client.appendObject(req);
System.out.println("putObjectAppend success" + ret.getETag());
}請求參數
AppendObjectRequest 中可設置的參數如下:
| 參數 | 說明 | 是否必須 |
|---|---|---|
| bucket | 桶名稱 | 是 |
| key | 對象名稱 | 是 |
| position | 追加前對象大小 | 是 |
| storageClass | 對象的存儲類型 | 否 |
返回結果
AppendObjectResult 返回的屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| ETag | String | 上傳對象后對應的Entity Tag |
獲取多版本對象列表
功能說明
如果桶開啟了版本控制,您可以使用 listVersions 接口列舉對象的版本,每次list操作最多返回1000個對象版本。
代碼示例
簡單列舉對象版本代碼如下:
public void listVersions() throws AmazonClientException {
System.out.println("listVersions");
String bucket = "<your-bucket-name>";
ListVersionsRequest request = new ListVersionsRequest();
request.setBucketName(bucket);
VersionListing list = s3Client.listVersions(request);
for (S3VersionSummary obj: list.getVersionSummaries()){
System.out.println("key: " + s3VersionSummary.getKey());
System.out.println("versionId: " + s3VersionSummary.getVersionId());
}
}如果 list 大于1000,則返回的結果中 isTruncated 為true,通過返回的 NextKeyMarker 和 NextUploadIdMarker 標記可以作為下次讀取的起點。列舉所有對象版本示例代碼如下:
public void listVersions2() throws AmazonClientException {
System.out.println("listVersions");
String bucket = "<your-bucket-name>";
String nextMarker = null;
String nextVersionIdMarker = null;
VersionListing versionListing;
do {
ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
listVersionsRequest.withBucketName(bucket).withKeyMarker(nextMarker).withVersionIdMarker(nextVersionIdMarker);
versionListing = s3Client.listVersions(listVersionsRequest);
for (S3VersionSummary s3VersionSummary: versionListing.getVersionSummaries()) {
System.out.println("key: " + s3VersionSummary.getKey());
System.out.println("versionId: " + s3VersionSummary.getVersionId());
}
nextMarker = versionListing.getNextKeyMarker();
nextVersionIdMarker = versionListing.getNextVersionIdMarker();
} while (versionListing.isTruncated());
?
}請求參數
ListVersionsRequest 中可設置的參數如下:
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| bucketName | String | 設置桶名稱 | 是 |
| encodingType | String | 用于設置返回對象的字符編碼類型 | 否 |
| keyMarker | String | 指定列出對象版本讀取對象的起點 | 否 |
| versionIdMarker | String | 指定列出對象版本讀取對象的版本的起點 | 否 |
| maxKeys | int | 設置response中返回對象的數量,默認值和最大值均為1000 | 否 |
| prefix | String | 限定列舉 objectKey 匹配前綴 prefix 的對象 | 否 |
| delimiter | String | 與prefix參數一起用于對對象key進行分組的字符。所有key包含指定的prefix且第一次出現Delimiter字符的對象作為一組。如果沒有指定prefix參數,按delimiter對所有對象key進行分割,多個對象分割后從對象key開始到第一個delimiter之間相同的部分形成一組 | 否 |
返回結果
返回的 VersionListing 屬性如下:
| 屬性名 | 類型 | 說明 |
|---|---|---|
| commonPrefixes | List<String> | 當請求中設置了delimiter和prefix屬性時,所有包含指定的Prefix且第一次出現delimiter字符的對象key作為一組 |
| versionSummaries | List<S3VersionSummary> | 對象版本數據,每個對象包含了Entity Tag、Key、VersionId、LastModifiedTime、Owner和Size等信息 |
| delimiter | String | 與請求中設置的delimiter一致 |
| encodingType | String | 返回對象版本的字符編碼類型 |
| isTruncated | boolean | 當為false時表示返回結果中包含了全部符合本次請求查詢條件的對象版本信息,否則只返回了數量為MaxKeys個的對象版本信息 |
| marker | String | 與請求中設置的Marker一致 |
| maxKeys | int | 本次返回結果中包含的對象版本數量的最大值 |
| bucketName | String | 執行本操作的桶名稱 |
| nextMarker | String | 當返回結果中的IsTruncated為true時,可以使用NextMarker作為下次查詢的Marker,繼續查詢出下一部分的對象信息 |
| prefix | String | 與請求中設置的prefix一致 |
解凍歸檔對象
功能說明
當需要下載歸檔類型的對象時,通常不能直接讀取,需要先進行解凍,并等待解凍完成后才可以讀寫該對象。您可以使用 restoreObject 接口解凍歸檔對象。
代碼示例
下面的代碼示例演示了如何使用restoreObject函數對歸檔對象進行解凍:
public void restoreObject() {
System.out.println("restoreObject");
String key = "ExampleObject.txt";
?
RestoreObjectRequest req = new RestoreObjectRequest(bucket, key);
req.setExpirationInDays(1); // 設置對象從歸檔恢復后的可用期限
?
RestoreObjectResult ret = s3Client.restoreObjectV2(req);
System.out.println(ret);
}請求參數
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| bucket | String | bucket的名稱 | 是 |
| objectKey | String | 對象的名稱 | 是 |
| expirationInDays | int | 歸檔恢復后的可用期限 | 否 |
返回結果
| 屬性名 | 類型 | 說明 |
|---|---|---|
| statusCode | Integer | 本次請求返回的狀態碼 |
| error | String | 錯誤碼,解凍成功時,不返回該字段 |
| message | String | 錯誤文本信息,解凍成功時,為空字符串 |
查詢解凍狀態
功能說明
您可以使用 getGlacierObjectStatus 接口查詢歸檔對象當前的解凍狀態。
代碼示例
下面的代碼示例演示了如何使用getGlacierObjectStatus接口查詢歸檔對象的解凍狀態:
public void getGlacierObjectStatus() {
System.out.println("getGlacierObjectStatus");
String key = "ExampleObject.txt";
?
GlacierObjectStatusResult restoreStatus = s3Client.getGlacierObjectStatus(bucket, key);
System.out.println("getGlacierObjectStatus success, glacier object status: " + restoreStatus.getObjectStatus());
}請求參數
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| bucket | String | bucket的名稱 | 是 |
| objectKey | String | 對象的名稱 | 是 |
返回結果
| 屬性名 | 類型 | 說明 |
|---|---|---|
| statusCode | Integer | 本次請求的結果碼 |
| message | String | 錯誤文本信息,查詢成功時,為空字符串 |
| objectStatus | String | 對象的狀態,包括OBJECT_IS_NOT_GLACIER、TEMP_OBJECT_STALE、DURING_UNFREEZE以及TEMP_OBJECT_EFFECTIVE |
| error | String | 錯誤碼,查詢成功時,不返回該字段 |