获取Object
更新时间:2022-10-21
简单的获取Object
用户可以通过如下代码将Object读取到一个流中。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.getObject()方法,会返回指定的BosObject。
- 将BosObject读到流中,然后对流进行操作。
示例代码
Java
1// 获取Object,返回结果为BosObject对象
2BosObject object = client.getObject(<BucketName>, <ObjectKey>);
3
4// 获取ObjectMeta
5ObjectMetadata meta = object.getObjectMetadata();
6
7// 获取Object的输入流
8InputStream objectContent = object.getObjectContent();
9
10// 处理Object
11...
12
13// 关闭流
14objectContent.close();
注意:
- BosObject中包含了Object的各种信息,包含Object所在的Bucket、Object的名称、MetaData以及一个输入流,用户可以通过操作输入流将Object的内容读取到文件或者内存中。
- ObjectMetadata中包含了Object上传时定义的ETag,Http Header以及自定义的元数据。
- 通过BosObject的getObjectContent()方法,还可以获取返回Object的输入流,用户可以读取这个输入流来对Object的内容进行操作。
完整示例
Java
1import java.io.BufferedReader;
2import java.io.IOException;
3import java.io.InputStream;
4import java.io.InputStreamReader;
5import android.app.Activity;
6import android.os.Bundle;
7import com.baidubce.BceClientException;
8import com.baidubce.BceServiceException;
9import com.baidubce.auth.DefaultBceCredentials;
10import com.baidubce.demo.R;
11import com.baidubce.services.bos.BosClient;
12import com.baidubce.services.bos.BosClientConfiguration;
13import com.baidubce.services.bos.model.BosObject;
14import com.baidubce.services.bos.model.ObjectMetadata;
15
16public class ExampleActivity extends Activity {
17
18private String bucketName = <BucketName>;
19private String objectKey = <ObjectKey>;
20
21@Override
22protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_main);
25 new Thread(new Runnable() {
26 @Override
27 public void run() {
28 try {
29 BosClientConfiguration config = new BosClientConfiguration();
30 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
31 config.setEndpoint(<EndPoint>);
32 BosClient client = new BosClient(config);
33
34 // 获取Object,返回结果为BosObject对象
35 BosObject object = client.getObject(<BucketName>, <ObjectKey>);
36
37 // 获取ObjectMeta
38 ObjectMetadata meta = object.getObjectMetadata();
39
40 // 获取Object的输入流
41 InputStream objectContent = object.getObjectContent();
42
43 // 处理Object
44 FileOutputStream fos=new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+"/1/file");
45 byte[] buffer=new byte[<bufferSize>];
46 int count=0;
47 while ((count=objectContent.read(buffer))>=0) {
48 fos.write(buffer,0,count);
49 }
50
51 System.out.println(meta.getETag());
52 System.out.println(meta.getContentLength());
53
54 // 关闭流
55 objectContent.close();
56 fos.close();
57
58 } catch (BceServiceException e) {
59 System.out.println("Error ErrorCode: " + e.getErrorCode());
60 System.out.println("Error RequestId: " + e.getRequestId());
61 System.out.println("Error StatusCode: " + e.getStatusCode());
62 System.out.println("Error Message: " + e.getMessage());
63 System.out.println("Error ErrorType: " + e.getErrorType());
64 } catch (BceClientException e) {
65 System.out.println("Error Message: " + e.getMessage());
66 } catch (IOException e) {
67 // TODO Auto-generated catch block
68 e.printStackTrace();
69 }
70 }
71 }).start();
72}}
通过GetObjectRequest获取Object
为了实现更多的功能,可以通过使用GetObjectRequest来获取Object。
基本流程
- 创建GetObjectRequest类的实例。
- 对GetObjectRequest执行setRange( ),获取Object中所需的字节数据。
- 执行client.getObject( )操作。
示例代码
Java
1// 新建GetObjectRequest
2GetObjectRequest getObjectRequest = new GetObjectRequest(<BucketName>, <ObjectKey>);
3
4// 获取0~100字节范围内的数据
5getObjectRequest.setRange(0, 100);
6
7// 获取Object,返回结果为BosObject对象
8BosObject object = client.getObject(getObjectRequest);
说明:通过getObjectRequest的setRange( )方法可以设置返回Object的范围。用户可以用此功能实现文件的分段下载和断点续传。
获取下载进度
用户可以通过回调函数获取到下载的进度信息。
SDK提供的下载进度回调接口如下,您可以在其中定义在上传过程中您所需要的操作,如更新界面等等。
Java
1public interface BceProgressCallback<T extends AbstractBceRequest> {
2 // request为下载的请求
3 // currentSize为当前下载的大小(单位:byte)
4 // totalSize为本次请求需要下载的总大小(单位:byte)
5 void onProgress(T request, long currentSize, long totalSize);
6 }
示例代码
Java
1GetObjectRequest request = new GetObjectRequest()
2 .withBucketName(this.bucketName)
3 .withKey(objectKey)
4 .withRange(0, 5);
5request.setProgressCallback(new BosProgressCallback<GetObjectRequest>() {
6 @Override
7 public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
8 Log.e(currentSize + "", totalSize + "");
9 }
10});
11InputStream input = this.client.getObject(request).getObjectContent();
注意: 下载进度接口与上传进度接口有所不同,无法指定每次回调时,下载量增长的片段大小。
下载Object到指定路径
用户可以通过如下代码直接将Object下载到指定路径。
基本流程
- 创建GetObjectRequest类的实例。
- 执行client.getObject( )操作。
- Object可以直接下载到指定路径。
示例代码
Java
1// 新建GetObjectRequest
2GetObjectRequest getObjectRequest = new GetObjectRequest(<BucketName>, <ObjectKey>);
3
4// 下载Object到文件
5ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file","w+"));
说明:当使用上面方法将Object直接下载到指定路径时,方法会返回ObjectMetadata对象。
获取Object的storageClass
Object的storage class属性分为STANDARD(标准存储)、STANDARD_IA(低频存储)、COLD(冷存储)和ARCHIVE(归档存储)。
示例代码
Java
1public void getObjectStorageClass(){
2 //...
3ObjectMetadata meta = client.getObjectMetadata(bucketName, key);
4String storageClass = meta.getStorageClass();
5}
只获取ObjectMetadata
通过 getObjectMetadata() 方法可以只获取ObjectMetadata而不获取Object的实体。
示例代码
Java
1ObjectMetadata objectMetadata = client.getObjectMetadata(<BucketName>, <ObjectKey>);
获取Object的URL
您可以通过如下代码获取指定Object的URL,该功能通常用于您将Object的URL临时分享给其他用户的场景。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.generatePresignedUrl( )方法。
- 返回一个Object的URL。
示例代码
Java
1URL url = client.generatePresignedUrl(<BucketName>, <ObjectKey>, <ExpirationInSeconds>);
说明:
ExpirationInSeconds
为指定的URL有效时长,时间从当前时间算起,为可选参数,不配置时系统默认值为1800秒。如果要设置为永久不失效的时间,可以将ExpirationInSeconds
参数设置为 -1,不可设置为其他负数。
完整示例
Java
1import java.net.URL;
2import android.app.Activity;
3import android.content.Intent;
4import android.net.Uri;
5import android.os.Bundle;
6import com.baidubce.BceClientException;
7import com.baidubce.BceServiceException;
8import com.baidubce.auth.DefaultBceCredentials;
9import com.baidubce.demo.R;
10import com.baidubce.services.bos.BosClient;
11import com.baidubce.services.bos.BosClientConfiguration;
12
13public class ExampleActivity extends Activity {
14private String bucketName = <BucketName>;
15private String objectKey = <ObjectKey>;
16
17@Override
18protected void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21 new Thread(new Runnable() {
22 @Override
23 public void run() {
24 try {
25 BosClientConfiguration config = new BosClientConfiguration();
26 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
27 config.setEndpoint(<EndPoint>);
28 BosClient client = new BosClient(config);
29
30 //获取Object的URL
31 URL url = client.generatePresignedUrl(<BucketName>, <ObjectKey>, 2000);
32 Uri uri = Uri.parse(url.toString());
33 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
34
35 //执行URL
36 startActivity(intent);
37
38 } catch (BceServiceException e) {
39 System.out.println("Error ErrorCode: " + e.getErrorCode());
40 System.out.println("Error RequestId: " + e.getRequestId());
41 System.out.println("Error StatusCode: " + e.getStatusCode());
42 System.out.println("Error Message: " + e.getMessage());
43 System.out.println("Error ErrorType: " + e.getErrorType());
44 } catch (BceClientException e) {
45 System.out.println("Error Message: " + e.getMessage());
46 }
47 }
48 }).start();
49}}