上传Object
最简单的上传
基本流程
- 创建BOSClient 类的实例。
- 调用BOSClient.putObject()方法,可以通过如下四种方式上传Object:文件、数据流、二进制串和字符串的形式。
- 对返回的PutObjectResponse类型实例,执行getETag()获得上传成功的ETag。
示例代码
1// 获取指定文件
2File file = new File(<FilePath>); //指定文件路径
3
4// 以文件形式上传Object
5PutObjectResponse putObjectFromFileResponse =
6 client.putObject(<BucketName>, <ObjectKey>, file);
7
8// 获取数据流
9InputStream inputStream = new FileInputStream(<FilePath>);
10
11// 以数据流形式上传Object
12PutObjectResponse putObjectResponseFromInputStream =
13 client.putObject(<BucketName>, <ObjectKey>, inputStream);
14
15// 以二进制串上传Object
16PutObjectResponse putObjectResponseFromByte =
17 client.putObject(<BucketName>, <ObjectKey>, <byte>);
18
19// 以字符串上传Object
20PutObjectResponse putObjectResponseFromString =
21 client.putObject(<BucketName>, <ObjectKey>, <string>);
22
23// 打印ETag
24System.out.println(putObjectFromFileResponse.getETag());
说明:Object以文件的形式上传到BOS中,putObject函数支持不超过5GB的Object上传。在putObject请求处理成功后,BOS会在Header中返回Object的ETag作为文件标识。
完整示例
1import java.io.File;
2import java.io.FileInputStream;
3import java.io.FileNotFoundException;
4import java.io.InputStream;
5import android.app.Activity;
6import android.os.Bundle;
7import com.baidubce.BceClientException;
8import com.baidubce.BceServiceException;
9import com.baidubce.auth.DefaultBceCredentials;
10import com.baidubce.development.R;
11import com.baidubce.services.bos.BosClient;
12import com.baidubce.services.bos.BosClientConfiguration;
13import com.baidubce.services.bos.model.PutObjectResponse;
14
15public class ExampleActivity extends Activity {
16
17 private String bucketName = <BucketName>;
18 private String objectKey = <ObjectKey>;
19 byte[] b = null;
20 String str = <PutString>;
21
22 @Override
23 protected void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.activity_main);
26 new Thread(new Runnable() {
27 @Override
28 public void run() {
29 try {
30 BosClientConfiguration config = new BosClientConfiguration();
31 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
32 config.setEndpoint(<EndPoint>);
33 BosClient client = new BosClient(config);
34
35 // 获取指定文件
36 File file = new File("/path/to/file.zip");
37
38 // 以文件形式上传Object
39 PutObjectResponse putObjectFromFileResponse = client.putObject(<BucketName>, <ObjectKey>, file);
40
41 // 获取数据流
42 InputStream inputStream = new FileInputStream("/path/to/test.zip");
43
44 // 以数据流形式上传Object
45 PutObjectResponse putObjectResponseFromInputStream = client.putObject(<BucketName>, <ObjectKey>, inputStream);
46
47 // 以二进制串上传Object
48 PutObjectResponse putObjectResponseFromByte = client.putObject(<BucketName>, <ObjectKey>, b);
49
50 // 以字符串上传Object
51 PutObjectResponse putObjectResponseFromString = client.putObject(<BucketName>, <ObjectKey>, str);
52
53 // 打印ETag
54 System.out.println(putObjectFromFileResponse.getETag());
55
56 } catch (BceServiceException e) {
57 System.out.println("Error ErrorCode: " + e.getErrorCode());
58 System.out.println("Error RequestId: " + e.getRequestId());
59 System.out.println("Error StatusCode: " + e.getStatusCode());
60 System.out.println("Error Message: " + e.getMessage());
61 System.out.println("Error ErrorType: " + e.getErrorType());
62 } catch (BceClientException e) {
63 System.out.println("Error Message: " + e.getMessage());
64 } catch (FileNotFoundException e) {
65 // TODO Auto-generated catch block
66 e.printStackTrace();
67 }
68 }
69 }).start();
70}}
设定Object的Copy属性
CopyObject接口用于将一个已经存在的Object拷贝到另外一个Object,拷贝过程中会对源Object的Etag或修改状态进行判断,根据判断结果决定是否执行拷贝。详细的参数解释如下:
名称 | 类型 | 描述 | 是否必需 |
---|---|---|---|
x-bce-copy-source-if-match | String | 如果源Object的ETag值和用户提供的ETag相等,则执行拷贝操作,否则拷贝失败。 | 否 |
x-bce-copy-source-if-none-match | String | 如果源Object的ETag和用户提供的ETag不相等,则执行拷贝操作,否则拷贝失败。 | 否 |
x-bce-copy-source-if-unmodified-since | String | 如果源object在x-bce-copy-source-if-unmodified-since之后没被修改,则执行拷贝操作,否则拷贝失败。 | 否 |
x-bce-copy-source-if-modified-since | String | 如果源object在x-bce-copy-source-if-modified-since之后被修改了,则执行拷贝操作,否则拷贝失败。 | 否 |
示例代码
1// 初始化BosClient
2BosClient client = ...;
3
4// 创建CopyObjectRequest对象
5CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);
6
7// 设置新的Metadata
8Map<String, String> userMetadata = new HashMap<String, String>();
9userMetadata.put("<user-meta-key>","<user-meta-value>");
10ObjectMetadata meta = new ObjectMetadata();
11meta.setUserMetadata(userMetadata);
12copyObjectRequest.setNewObjectMetadata(meta);
13
14//copy-source-if-match
15copyObjectRequest.withETag("111111111183bf192b57a4afc76fa632");
16//copy-source-if-none-match
17copyObjectRequest.withNoMatchingETagConstraint("111111111183bf192b57a4afc76fa632");
18
19Date modifiedSinceConstraint = new Date();
20SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
21df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));
22String date = df.format(modifiedSinceConstraint);
23
24//copy-source-if-modified-since
25copyObjectRequest.withModifiedSinceConstraint(date);
26
27//copy-source-if-unmodified-since
28copyObjectRequest.withUnmodifiedSinceConstraint(date);
29
30// 复制Object
31CopyObjectResponse copyObjectResponse = client.copyObject(copyObjectRequest);
设定Object的Http Header
BOS支持您在上传object时设定Http Header。
基本流程
- 创建ObjectMetadata类的实例。
- 执行setContentLength()/setContentType()等方法对Http Header进行设定。
- 将设定后的meta作为参数加入client.putObject()中。
示例代码
1// 创建ObjectMetadata类的实例
2ObjectMetadata meta = new ObjectMetadata();
3
4// 设置ContentLength大小
5meta.setContentLength(<Length>);
6
7// 设置ContentType
8meta.setContentType("application/json");
9
10client.putObject(<BucketName>, <ObjectKey>, content, meta);
说明:header可设置的属性有:"Cache-Control"、"Content-Encoding"、"Content-Disposition"、"Expires"
完整示例
1import java.io.FileInputStream;
2import java.io.FileNotFoundException;
3import java.io.InputStream;
4import android.app.Activity;
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;
12import com.baidubce.services.bos.model.ObjectMetadata;
13import com.baidubce.services.bos.model.PutObjectResponse;
14
15public class ExampleActivity extends Activity {
16
17private String bucketName = <BucketName>;
18private String objectKey = <ObjectKey>;
19
20@Override
21protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activity_main);
24 new Thread(new Runnable() {
25 @Override
26 public void run() {
27 try {
28 BosClientConfiguration config = new BosClientConfiguration();
29 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
30 config.setEndpoint(<EndPoint>);
31 BosClient client = new BosClient(config);
32
33 // 获取数据流
34 InputStream inputStream = new FileInputStream("/path/to/test.zip");
35
36 // 创建ObjectMetadata类的实例
37 ObjectMetadata meta = new ObjectMetadata();
38
39 // 设置ContentLength大小
40 meta.setContentLength(1000);
41
42 // 设置ContentType
43 meta.setContentType("application/json");
44
45 PutObjectResponse putObjectResponseFromInputStream = client.putObject(bucketName, objectKey, inputStream, meta);
46
47 // 打印ETag
48 System.out.println(putObjectResponseFromInputStream.getETag());
49
50 } catch (BceServiceException e) {
51 System.out.println("Error ErrorCode: " + e.getErrorCode());
52 System.out.println("Error RequestId: " + e.getRequestId());
53 System.out.println("Error StatusCode: " + e.getStatusCode());
54 System.out.println("Error Message: " + e.getMessage());
55 System.out.println("Error ErrorType: " + e.getErrorType());
56 } catch (BceClientException e) {
57 System.out.println("Error Message: " + e.getMessage());
58 } catch (FileNotFoundException e) {
59 // TODO Auto-generated catch block
60 e.printStackTrace();
61 }
62 }
63 }).start();
64}}
用户自定义元数据
BOS支持用户自定义元数据来对Object进行描述。
基本流程
- 创建ObjectMetadata类的实例。
- 执行addUserMetadata()方法对Http Header进行自定义元数据。
- 将设定后的meta作为参数加入client.putObject()中。
示例代码
1// 设置自定义元数据name的值为my-data
2meta.addUserMetadata("name", "my-data");
3
4// 上传Object
5client.putObject(<BucketName>, <ObjectKey>, <Content>, meta);
说明:在上面代码中,用户自定义了一个名字为”name”,值为”my-data”的元数据。当用户下载此Object的时候,此元数据也可以一并得到。一个Object可以有多个类似的参数,但所有的User Meta总大小不能超过2KB。
完整示例
1import java.io.FileInputStream;
2import java.io.FileNotFoundException;
3import java.io.InputStream;
4import android.app.Activity;
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;
12import com.baidubce.services.bos.model.ObjectMetadata;
13import com.baidubce.services.bos.model.PutObjectResponse;
14
15public class ExampleActivity extends Activity {
16
17private String bucketName = <BucketName>;
18private String objectKey = <ObjectKey>;
19
20@Override
21protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activity_main);
24 new Thread(new Runnable() {
25 @Override
26 public void run() {
27 try {
28 BosClientConfiguration config = new BosClientConfiguration();
29 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
30 config.setEndpoint(<EndPoint>);
31 BosClient client = new BosClient(config);
32
33 // 获取数据流
34 InputStream inputStream = new FileInputStream("/path/to/test.zip");
35
36 // 创建ObjectMetadata类的实例
37 ObjectMetadata meta = new ObjectMetadata();
38
39 // 自定义元数据
40 meta.addUserMetadata("name", "my-data");
41
42 PutObjectResponse putObjectResponseFromInputStream = client.putObject(<BucketName>, <ObjectKey>, inputStream, meta);
43
44 // 打印ETag
45 System.out.println(putObjectResponseFromInputStream.getETag());
46
47 } catch (BceServiceException e) {
48 System.out.println("Error ErrorCode: " + e.getErrorCode());
49 System.out.println("Error RequestId: " + e.getRequestId());
50 System.out.println("Error StatusCode: " + e.getStatusCode());
51 System.out.println("Error Message: " + e.getMessage());
52 System.out.println("Error ErrorType: " + e.getErrorType());
53 } catch (BceClientException e) {
54 System.out.println("Error Message: " + e.getMessage());
55 } catch (FileNotFoundException e) {
56 // TODO Auto-generated catch block
57 e.printStackTrace();
58 }
59 }
60 }).start();
61}}
Append方式上传Object
BOS支持AppendObject,即以追加写的方式上传文件,适用场景如日志追加及直播等实时视频文件上传。通过AppendObject操作创建的Object类型为Appendable Object,可以对该Object追加数据;而通过PutObject上传的Object是Normal Object,不可进行数据追加写。AppendObject大小限制为0~5G。
示例代码
1public void AppendObject(BosClient client, String bucketName, String objectKey, byte[] byte1, String string1) {
2 // 获取指定文件
3 File file = new File("/path/to/file.zip");
4 // 获取数据流
5 InputStream inputStream = new FileInputStream("/path/to/test.zip");
6
7 // 以文件形式上传Object
8 AppendObjectResponse appendObjectFromFileResponse = client.appendObject(bucketName, objectKey, file);
9 // 以数据流形式上传Object
10 AppendObjectResponse appendObjectResponseFromInputStream = client.appendObject(bucketName, objectKey, inputStream);
11 // 以二进制串上传Object
12 AppendObjectResponse appendObjectResponseFromByte = client.appendObject(bucketName, objectKey, byte1);
13 // 以字符串上传Object
14 AppendObjectResponse appendObjectResponseFromString = client.appendObject(bucketName, objectKey, string1);
15
16 // 向AppendFile追加内容
17 Long nextOffset = appendObjectFromFileResponse.getNextAppendOffset();
18 AppendObjectRequest request =new AppendObjectRequest(bucketName, objectKey,
19 RestartableInputStream.wrap(string1.getBytes()));
20 request.withOffset(nextOffset);
21 AppendObjectResponse appendResponse = client.appendObject(request);
22}
获取上传进度
Android SDK支持在上传过程中实时提供上传进度信息。目前支持PutObject, AppendObject, UploadPart以及PutSuperObjectFromFile四个接口。进度上传接口的使用必须构造对应的Request (PutObjectRequest
, AppendObjectRequest
, UploadPartRequest
以及PutSuperObjectRequest
)。
SDK提供的上传进度回调接口如下,您可以在其中定义上传过程中您所需要的操作,如更新界面等等。
1public interface BceProgressCallback<T extends AbstractBceRequest> {
2 // request为上传的请求
3 // currentSize为当前上传的大小(单位:byte)
4 // totalSize为本次请求需要上传的总大小(单位:byte)
5 void onProgress(T request, long currentSize, long totalSize);
6}
PutObject示例代码
1PutObjectRequest request = new PutObjectRequest(this.bucketName, "test", file);
2ObjectMetadata objectMetadata = new ObjectMetadata();
3objectMetadata.setContentType("text/plain");
4request.setObjectMetadata(objectMetadata);
5request.setProgressCallback(new BosProgressCallback<PutObjectRequest>() {
6 @Override
7 public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
8 Log.e(currentSize + "", totalSize + "");
9 }
10});
11String eTag = this.client.putObject(request).getETag();
AppendObject示例代码
1ObjectMetadata objectMetadata = new ObjectMetadata();
2objectMetadata.setContentType("text/plain");
3AppendObjectRequest request = new AppendObjectRequest(this.bucketName, "test", file);
4request.setObjectMetadata(objectMetadata);
5AppendObjectResponse response = this.client.appendObject(request);
6Long nextOffset = response.getNextAppendOffset();
7request.withOffset(nextOffset);
8request.setProgressCallback(new BosProgressCallback<AppendObjectRequest>() {
9 @Override
10 public void onProgress(AppendObjectRequest request, long currentSize, long totalSize) {
11 Log.e(currentSize + "", totalSize + "");
12 }
13});
14response = this.client.appendObject(request);
UploadPart示例代码
1UploadPartRequest request = new UploadPartRequest().withBucketName(this.bucketName)
2 .withKey("test").withUploadId(uploadId).withPartNumber(1).withPartSize(8000)
3 .withInputStream(fis);
4request.setProgressCallback(new BosProgressCallback<UploadPartRequest>() {
5 @Override
6 public void onProgress(UploadPartRequest request, long currentSize, long totalSize) {
7 Log.e(currentSize + "", totalSize + "");
8 }
9});
10UploadPartResponse response = this.client.uploadPart(request);
PutSuperObjectFromFile示例代码
1PutSuperObjectRequest request = new PutSuperObjectRequest().withBucketName(this.bucketName)
2 .withKey("test").withPartSize(1024*1024*2L).withFile(file);
3request.setProgressCallback(new BosProgressCallback<PutSuperObjectRequest>() {
4 @Override
5 public void onProgress(PutSuperObjectRequest request, long currentSize, long totalSize) {
6 Log.e(currentSize + "", totalSize + "");
7 }
8});
9PutSuperObjectResponse response = this.client.putSuperObjectFromFile(request);
目前,SDK默认上传进度的回调粒度为2048个字节。您可以通过如下方法设置一个更适合您App应用的回调粒度:
BosClientConfiguration config=new BosClientConfiguration(); config.setUploadSegmentPart(1024);
注意: 该值必须在1-8192之间,如不在该范围内,Android SDK会强制设置为2048.
取消接口
Android SDK支持在请求过程中取消本次请求,其中上传请求中剩余的数据将不再会上传至BOS,下载请求中取消操作会关闭连接,执行中的操作会抛出Request is canceled!
异常
所有的BOS操作都可以使用取消接口,但是已经完成的请求无法被取消,已经完成的操作也不会抛出异常
1// 以上传接口取消为例
2final PutObjectRequest req = new PutObjectRequest(<BucketName>, <ObjectName>,
3 new FileInputStream(<FilePath>));
4Runnable cancelTask = new Runnable() {
5 @Override
6 public void run() {
7 try {
8 Thread.sleep(100);
9 } catch (InterruptedException e) {
10 e.printStackTrace()
11 }
12 // 取消本次上传请求
13 req.cancel();
14 }
15};
16new Thread(cancelTask).start();
17client.putObject(req);
同步回调
Android SDK支持BOS服务端同步回调接口,通过在PutObjectRequest中,设置process参数,就可以在上传完成后,让BOS服务端主动调用回调接口来达到通知客户目的。
1PutObjectRequest request = new PutObjectRequest({bucket}, {object}, {inputStream});
2// 设置x-bce-process参数
3request.setProcess({x-bce-process});
4PutObjectResponse response = client.putObject(request);
5// 获取返回的http status code
6int statusCode = response.getHttpResponse().getStatusCode();
7// 获取返回的回调接口返回的数据
8string callbackString = response.getServerCallbackReturnBody();
单链接限速
对象存储BOS的单Bucket带宽是有限制的,当用户的上传或下载占用带宽达到带宽限制阈值时,会返回RequestRateLimitExceeded的错误码。
为保证用户能够正常使用服务,BOS支持在进行上传、下载等行为时进行流量控制,保证大流量服务占用带宽不会对其他应用服务造成影响。
读写接口支持设置指定限速值,限速值的取值范围为819200~838860800,单位为bit/s,即100KB/s~100MB/s。限速值取值必须为数字,BOS将按照指定的限速值对此次请求进行限速,当限速值不在此范围或不合法时将返回400错误码。
当前PutObjectRequest、PutSuperObjectRequest、UploadPartRequest、CopyObjectRequest、GetObjectRequest均支持设置单链接限速。 以PutObjectRequest为例:
1PutObjectRequest request = new PutObjectRequest({bucket}, {object}, {inputStream});
2// 设置单链接限速
3request.setTrafficLimitBitPS(819200);