- 产品文档
- > 存储与 CDN
- > 对象存储
- > AWS S3 兼容
- > AWS S3 SDK
- > S3 Java SDK手册
- > 文件管理
文件管理
您可以通过AWS S3 Java SDK进行如下文件管理操作:
- 判断文件是否存在
- 文件删除
- 获取文件元数据信息
- 文件复制(copy)
- 列举桶内文件
判断文件是否存在
您可以通过AmazonS3.doesObjectExist判断文件是否存在。
boolean isExist = s3Client.doesObjectExist("your-bucketname","your-objectname");
文件删除
您可以通过AmazonS3.deleteObject删除单个文件
s3Client.deleteObject("your-bucketname","your-objectname");
您还可以通过AmazonS3.deleteObjects一次删除多个文件
try {
DeleteObjectsResult result = s3Client.deleteObjects(deleteObjectsRequest);
List<DeletedObject> deleteObjects = result.getDeletedObjects();
//print the delete results
for (DeletedObject items: deleteObjects){
System.out.println(items.getKey());
}
// 部分对象删除失败
} catch (MultiObjectDeleteException e) {
List<DeleteError> deleteErrors = e.getErrors();
for (DeleteError error : deleteErrors) {
System.out.println(error.getKey());
}
} catch (AmazonServiceException e) {
//捕捉nos服务器异常错误
} catch (AmazonClientException ace) {
//捕捉客户端错误
}
获取文件元数据信息
您可以通过AmazonS3.getObjectMetadata获取文件元数据信息
s3Client.getObjectMetadata("your-bucketname","your-objectname");
文件复制(copy)
您可以通过AmazonS3.copyObject接口实现文件拷贝功能。 NOS支持桶内copy以及相同用户的跨桶copy。
s3Client.copyObject("source-bucket", "source-object", "dst-bucket", "dst-object");
列举桶内文件
您可以通过AmazonS3.listObjects列出桶里的文件。listObjects接口如果调用成功,会返回一个ObjectListing对象,列举的结果保持在该对象中。
ObjectListing的具体信息如下表所示:
方法 | 含义 |
---|---|
List | 返回的文件列表(包含文件的名称、Etag的元数据信息) |
String getPrefix() | 本次查询的文件名前缀 |
String getDelimiter() | 文件分界符 |
String getMarker() | 这次List Objects的起点 |
int getMaxKeys() | 响应请求内返回结果的最大数目 |
String getNextMarker() | 下一次List Object的起点 |
boolean isTruncated() | 是否截断,如果因为设置了limit导致不是所有的数据集都返回,则该值设置为true |
List | 如果请求中指定了delimiter参数,则返回的包含CommonPrefixes元素。该元素标明以delimiter结尾,并有共同前缀的对象的集合 |
AmazonS3.listObjects接口提供两种调用方式:简单列举、通过ListObjectsRequest列举
简单列举
简单列举只需指定需要列举的桶名,最多返回100条对象记录,建议桶内对象数较少时(小于100)使用。
ObjectListing objectListing = AmazonS3.listObjects("your-bucketname");
List<S3ObjectSummary> sums = objectListing.getObjectSummaries();
for (S3ObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
通过ListObjectsRequest列举
您还可以通过设置ListObjectsReques参数实现各种灵活的查询功能。ListObjectsReques的可设置的参数如下:
设置方法 | 作用 |
---|---|
setPrefix(String prefix) | 限定返回的object key必须以prefix作为前缀 |
setDelimiter(String delimiter) | 是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes |
setMarker(String marker) | 字典序的起始标记,只列出该标记之后的部分 |
setMaxKeys(Integer maxKeys) | 限定返回的数量,返回的结果小于或等于该值(默认值为100) |
1、分页列举桶内的所有文件:
List<S3ObjectSummary> listResult = new ArrayList<S3ObjectSummary>();
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName("your-bucketname");
listObjectsRequest.setMaxKeys(50);
ObjectListing listObjects = AmazonS3.listObjects(listObjectsRequest);
do {
listResult.addAll(listObjects.getObjectSummaries());
if (listObjects.isTruncated()) {
ListObjectsRequest request = new ListObjectsRequest();
request.setBucketName(listObjectsRequest.getBucketName());
request.setMarker(listObjects.getNextMarker());
listObjects = AmazonS3.listObjects(request);
} else {
break;
}
} while (listObjects != null);
2、使用Delimiter模拟文件夹功能
假设桶内有如下对象:a/1.jpg、a/2.jpg、a/b/1.txt、a/b/2.txt,列举a文件夹下的文件及子文件夹的示例代码如下:
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName("your-bucketname");
listObjectsRequest.setDelimiter("/");
listObjectsRequest.setPrefix("a/");
ObjectListing listing = s3Client.listObjects(listObjectsRequest);
// 遍历所有Object
System.out.println("Objects:");
for (S3ObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍历所有CommonPrefix
System.out.println("CommonPrefixs:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
示例代码的输出如下:
Objects:
a/1.jpg
a/2.jpg
CommonPrefixs:
a/b/
生成私有对象可下载的URL链接
AWS Java SDK支持生成可下载私有对象的URL连接,您可以将该链接提供给第三方进行文件下载:
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
// 设置可下载URL的过期时间为1天后
generatePresignedUrlRequest.setExpiration(new Date(System.currentTimeMillis()+3600*1000*24));
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);//生成URL
System.out.println(url);//可以用这个url来下载文件