获取对象列表
功能说明
您可以使用 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字节的数据,详情请参见 RFC2616 | 否 |
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实现请查看 Java SDK Demo 。
代码示例
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 | 错误码,查询成功时,不返回该字段 |