获取Object
更新时间:2022-10-21
简单的获取Object
用户可以通过如下代码将Object读取到一个流中。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.getObject()方法,会返回指定的BosObject。
- 将BosObject读到流中,然后对流进行操作。
示例代码
// 获取Object,返回结果为BosObject对象
BosObject object = client.getObject(<BucketName>, <ObjectKey>);
// 获取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 获取Object的输入流
InputStream objectContent = object.getObjectContent();
// 处理Object
...
// 关闭流
objectContent.close();
注意:
- BosObject中包含了Object的各种信息,包含Object所在的Bucket、Object的名称、MetaData以及一个输入流,用户可以通过操作输入流将Object的内容读取到文件或者内存中。
- ObjectMetadata中包含了Object上传时定义的ETag,Http Header以及自定义的元数据。
- 通过BosObject的getObjectContent()方法,还可以获取返回Object的输入流,用户可以读取这个输入流来对Object的内容进行操作。
完整示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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.BosObject;
import com.baidubce.services.bos.model.ObjectMetadata;
public class ExampleActivity extends Activity {
private String bucketName = <BucketName>;
private String objectKey = <ObjectKey>;
@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);
// 获取Object,返回结果为BosObject对象
BosObject object = client.getObject(<BucketName>, <ObjectKey>);
// 获取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 获取Object的输入流
InputStream objectContent = object.getObjectContent();
// 处理Object
FileOutputStream fos=new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+"/1/file");
byte[] buffer=new byte[<bufferSize>];
int count=0;
while ((count=objectContent.read(buffer))>=0) {
fos.write(buffer,0,count);
}
System.out.println(meta.getETag());
System.out.println(meta.getContentLength());
// 关闭流
objectContent.close();
fos.close();
} 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());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}}
通过GetObjectRequest获取Object
为了实现更多的功能,可以通过使用GetObjectRequest来获取Object。
基本流程
- 创建GetObjectRequest类的实例。
- 对GetObjectRequest执行setRange( ),获取Object中所需的字节数据。
- 执行client.getObject( )操作。
示例代码
// 新建GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(<BucketName>, <ObjectKey>);
// 获取0~100字节范围内的数据
getObjectRequest.setRange(0, 100);
// 获取Object,返回结果为BosObject对象
BosObject object = client.getObject(getObjectRequest);
说明:通过getObjectRequest的setRange( )方法可以设置返回Object的范围。用户可以用此功能实现文件的分段下载和断点续传。
获取下载进度
用户可以通过回调函数获取到下载的进度信息。
SDK提供的下载进度回调接口如下,您可以在其中定义在上传过程中您所需要的操作,如更新界面等等。
public interface BceProgressCallback<T extends AbstractBceRequest> {
// request为下载的请求
// currentSize为当前下载的大小(单位:byte)
// totalSize为本次请求需要下载的总大小(单位:byte)
void onProgress(T request, long currentSize, long totalSize);
}
示例代码
GetObjectRequest request = new GetObjectRequest()
.withBucketName(this.bucketName)
.withKey(objectKey)
.withRange(0, 5);
request.setProgressCallback(new BosProgressCallback<GetObjectRequest>() {
@Override
public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
Log.e(currentSize + "", totalSize + "");
}
});
InputStream input = this.client.getObject(request).getObjectContent();
注意: 下载进度接口与上传进度接口有所不同,无法指定每次回调时,下载量增长的片段大小。
下载Object到指定路径
用户可以通过如下代码直接将Object下载到指定路径。
基本流程
- 创建GetObjectRequest类的实例。
- 执行client.getObject( )操作。
- Object可以直接下载到指定路径。
示例代码
// 新建GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(<BucketName>, <ObjectKey>);
// 下载Object到文件
ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file","w+"));
说明:当使用上面方法将Object直接下载到指定路径时,方法会返回ObjectMetadata对象。
获取Object的storageClass
Object的storage class属性分为STANDARD(标准存储)、STANDARD_IA(低频存储)、COLD(冷存储)和ARCHIVE(归档存储)。
示例代码
public void getObjectStorageClass(){
//...
ObjectMetadata meta = client.getObjectMetadata(bucketName, key);
String storageClass = meta.getStorageClass();
}
只获取ObjectMetadata
通过 getObjectMetadata() 方法可以只获取ObjectMetadata而不获取Object的实体。
示例代码
ObjectMetadata objectMetadata = client.getObjectMetadata(<BucketName>, <ObjectKey>);
获取Object的URL
您可以通过如下代码获取指定Object的URL,该功能通常用于您将Object的URL临时分享给其他用户的场景。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.generatePresignedUrl( )方法。
- 返回一个Object的URL。
示例代码
URL url = client.generatePresignedUrl(<BucketName>, <ObjectKey>, <ExpirationInSeconds>);
说明:
ExpirationInSeconds
为指定的URL有效时长,时间从当前时间算起,为可选参数,不配置时系统默认值为1800秒。如果要设置为永久不失效的时间,可以将ExpirationInSeconds
参数设置为 -1,不可设置为其他负数。
完整示例
import java.net.URL;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
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;
public class ExampleActivity extends Activity {
private String bucketName = <BucketName>;
private String objectKey = <ObjectKey>;
@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);
//获取Object的URL
URL url = client.generatePresignedUrl(<BucketName>, <ObjectKey>, 2000);
Uri uri = Uri.parse(url.toString());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
//执行URL
startActivity(intent);
} 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();
}}