查看Bucket中的Object
简单查询
查看Bucket中Object列表。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.listObjects(bucketName)方法,会返回ListObjectsResponse类的实例。
- 对ListObjectsResponse类型可以进行getBuckets()/getOwner()/getMetadata()操作。
示例代码
// 获取指定Bucket下的所有Object信息
ListObjectsResponse listing = client.listObjects(<BucketName>);
// 遍历所有Object
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println("ObjectKey: " + objectSummary.getKey());
}
说明: listObjects( )方法返回ListObjectsResponse对象,ListObjectsResponse对象包含了此次listObject请求的返回结果。用户可以通过ListObjectsResponse中的getContents方法获取所有Object的描述信息。
- 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中IsTruncated值为True,并返回NextMarker做为下次读取的起点。
- 若想获取更多的Object,可以使用Marker参数分次读取,请参考扩展查询。
完整示例
import android.app.Activity;
import android.os.Bundle;
import com.baidubce.BceClientException;
import com.baidubce.BceServiceException;
import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.demo.R;
import com.baidubce.services.bos.BosClient;
import com.baidubce.services.bos.BosClientConfiguration;
import com.baidubce.services.bos.model.BosObjectSummary;
import com.baidubce.services.bos.model.ListObjectsResponse;
public class ExampleActivity extends Activity {
private String bucketName = <BucketName>;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
try {
BosClientConfiguration config = new BosClientConfiguration();
config.setCredentials(new DefaultBceCredentials(<AccessKeyId>, <SecretAccessKey>));
config.setEndpoint(<EndPoint>);
BosClient client = new BosClient(config);
// 获取指定Bucket下的所有Object信息
ListObjectsResponse listing = client.listObjects(<BucketName>);
// 遍历所有Object
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println("ObjectKey: " + objectSummary.getKey());
}
} catch (BceServiceException e) {
System.out.println("Error ErrorCode: " + e.getErrorCode());
System.out.println("Error RequestId: " + e.getRequestId());
System.out.println("Error StatusCode: " + e.getStatusCode());
System.out.println("Error Message: " + e.getMessage());
System.out.println("Error ErrorType: " + e.getErrorType());
} catch (BceClientException e) {
System.out.println("Error Message: " + e.getMessage());
}
}
}).start();
}}
扩展查询
用户可以通过设置ListObjectsRequest参数来完成更多扩展查询操作设置。ListObjectsRequest中可以设置的扩展参数如下:
参数名称 | 说明 | 默认值 |
---|---|---|
MaxKeys | 设定此次返回Object的最大个数,不可超过1000。 | 1000 |
Prefix | 设定objectKey的前缀,前缀是指objectKey包含并以Prefix的值作为开始。 通常与Delimiter配合在查询模拟文件夹中使用。 |
- |
Delimiter | 是一个分隔符,用来对objectKey进行分层。 通常与Prefix配合在查询模拟文件夹中使用。 从Prefix开始到第一次出现Delimiter字符之间的objectKey称为:CommonPrefixes。 |
- |
Marker | 是一个字符串,用来设定返回结果的起始位置。 设定Marker值之后,返回的Object会从Marker值之后按字母排序开始返回。 |
- |
基本流程
- 创建ListObjectsRequest类的实例。
- 在ListObjectsRequest中执行setDelimiter/setMarker()/setPrefix()等方法,实现更多的扩展查询操作。
- 创建BOSClient类的实例,执行listObjects(listObjectsRequest)。
示例代码
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
// 设置扩展查询参数
listObjectsRequest.setDelimiter(<Delimiter>);
listObjectsRequest.setMarker(<Marker>);
...
ListObjectsResponse listing = client.listObjects(listObjectsRequest);
说明:上面代码中调用了
listObjects
中的一个重载方法,通过传入ListObjectsRequest
来完成请求。
完整示例
示例一:
import android.app.Activity;
import android.os.Bundle;
import com.baidubce.BceClientException;
import com.baidubce.BceServiceException;
import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.demo.R;
import com.baidubce.services.bos.BosClient;
import com.baidubce.services.bos.BosClientConfiguration;
import com.baidubce.services.bos.model.BosObjectSummary;
import com.baidubce.services.bos.model.ListObjectsRequest;
import com.baidubce.services.bos.model.ListObjectsResponse;
public class ExampleActivity extends Activity {
private String bucketName = <BucketName>;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
try {
BosClientConfiguration config = new BosClientConfiguration();
config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
config.setEndpoint(<EndPoint>);
BosClient client = new BosClient(config);
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
// 设置参数
listObjectsRequest.setDelimiter("/");
listObjectsRequest.setMarker("123");
listObjectsRequest.setMaxKeys(100);
listObjectsRequest.setPrefix("fun");
// 获取指定Bucket下符合上述条件的所有Object信息
ListObjectsResponse listing = client.listObjects(listObjectsRequest);
// 遍历所有Object
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println("ObjectKey: " + objectSummary.getKey());
}
} catch (BceServiceException e) {
System.out.println("Error ErrorCode: " + e.getErrorCode());
System.out.println("Error RequestId: " + e.getRequestId());
System.out.println("Error StatusCode: " + e.getStatusCode());
System.out.println("Error Message: " + e.getMessage());
System.out.println("Error ErrorType: " + e.getErrorType());
} catch (BceClientException e) {
System.out.println("Error Message: " + e.getMessage());
}
}
}).start();
}}
示例二:使用Nextmarker完整示例。
import android.app.Activity;
import android.os.Bundle;
import com.baidubce.BceClientException;
import com.baidubce.BceServiceException;
import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.demo.R;
import com.baidubce.services.bos.BosClient;
import com.baidubce.services.bos.BosClientConfiguration;
import com.baidubce.services.bos.model.BosObjectSummary;
import com.baidubce.services.bos.model.ListObjectsRequest;
import com.baidubce.services.bos.model.ListObjectsResponse;
public class ExampleActivity extends Activity {
private String bucketName = <BucketName>;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
try {
BosClientConfiguration config = new BosClientConfiguration();
config.setCredentials(new DefaultBceCredentials(<AccessKeyId>, <SecretAccessKey>);
config.setEndpoint(<EndPoint>);
BosClient client = new BosClient(config);
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
listObjectsRequest.setMarker("");
listObjectsRequest.setMaxKeys(20);
listObjectsRequest.setDelimiter(BceConfig.BOS_DELIMITER);
ListObjectsResponse listObjectsResponse = client.listObjects(listObjectsRequest);
String nextMark = "";
if(listObjectsResponse.isTruncated()){
nextMark = listObjectsResponse.getNextMarker();
}
ListObjectsRequest listObjectsRequest2 = new ListObjectsRequest(<BucketName>);
listObjectsRequest2.setMarker(nextMark);
listObjectsRequest2.setMaxKeys(20);
listObjectsRequest2.setDelimiter(BceConfig.BOS_DELIMITER);
ListObjectsResponse listing = client.listObjects(listObjectsRequest2);
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println("ObjectKey: " + objectSummary.getKey());
}
} catch (BceServiceException e) {
System.out.println("Error ErrorCode: " + e.getErrorCode());
System.out.println("Error RequestId: " + e.getRequestId());
System.out.println("Error StatusCode: " + e.getStatusCode());
System.out.println("Error Message: " + e.getMessage());
System.out.println("Error ErrorType: " + e.getErrorType());
} catch (BceClientException e) {
System.out.println("Error Message: " + e.getMessage());
}
}
}).start();
}}
查询模拟文件夹
由于BOS本身是一个(<Key>,<Value>
)的存储系统,所以原则上并不会存在“文件夹”的概念,但您可以通过 Delimiter
和 Prefix
参数的配合进行文件夹功能模拟。
假设Bucket中有5个文件:bos.jpg,fun/,fun/test.jpg,fun/movie/001.avi,fun/movie/007.avi,可以把 “/” 符号作为分隔符模拟文件夹。
递归列出模拟文件夹下所有文件
可以通过设置 Prefix
参数来获取某个模拟文件夹下所有的文件:
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
// 递归列出fun文件夹下的所有文件
listObjectsRequest.setPrefix("fun/");
ListObjectsResponse listing = client.listObjects(listObjectsRequest);
// 遍历所有Object
System.out.println("Objects:");
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println(objectSummary.getKey());
}
输出:
Objects:
fun/
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg
查看模拟文件夹下的文件和子文件夹
在 Prefix
和 Delimiter
结合的情况下,可以列出模拟文件夹下的文件和子文件夹:
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
// 指定"/" 为模拟文件夹的分隔符
listObjectsRequest.setDelimiter("/");
// 列出fun文件夹下的所有文件和子文件夹
listObjectsRequest.setPrefix("fun/");
ListObjectsResponse listing = client.listObjects(listObjectsRequest);
// 遍历所有Object
System.out.println("Objects:");
for (BosObjectSummary objectSummary : listing.getContents()) {
System.out.println(objectSummary.getKey());
}
// 遍历所有CommonPrefix
System.out.println("\nCommonPrefixs:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
输出:
Objects:
fun/
fun/test.jpg
CommonPrefixs:
fun/movie/
说明:
返回的结果中,
Objects
的列表中给出的是fun文件夹下的文件。而CommonPrefixs
的列表中给出的是fun文件夹下的所有子文件夹。可以看出fun/movie/001.avi
,fun/movie/007.avi
两个文件并没有被列出来,因为它们属于fun
文件夹下的movie
子文件夹下的文件。