本文介绍如何使用简单上传。
上传本地文件
您可以通过同步方式或者异步方式上传本地文件到OSS。
- 调用同步接口上传
以下代码用于以同步方式上传examplefile.txt文件到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。
// 构造上传请求。 // 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件完整路径(例如/storage/emulated/0/oss/examplefile.txt)。 // Object完整路径中不能包含Bucket名称。 PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt"); // 设置文件元信息为可选操作。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setContentType("application/octet-stream"); // 设置content-type。 // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校验MD5。 // put.setMetadata(metadata); try { PutObjectResult putResult = oss.putObject(put); Log.d("PutObject", "UploadSuccess"); Log.d("ETag", putResult.getETag()); Log.d("RequestId", putResult.getRequestId()); } catch (ClientException e) { // 客户端异常,例如网络异常等。 e.printStackTrace(); } catch (ServiceException e) { // 服务端异常。 Log.e("RequestId", e.getRequestId()); Log.e("ErrorCode", e.getErrorCode()); Log.e("HostId", e.getHostId()); Log.e("RawMessage", e.getRawMessage()); }
对于Android10及之后版本的分区存储,您可以使用文件的Uri上传文件到OSS。
// 构造上传请求。 // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。 // Object完整路径中不能包含Bucket名称。 PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt",fileUri); // 设置文件元信息为可选操作。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setContentType("text/plain"); // 设置Content-Type。 // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校验MD5。 // put.setMetadata(metadata); try { PutObjectResult putResult = oss.putObject(put); Log.d("PutObject", "UploadSuccess"); Log.d("ETag", putResult.getETag()); Log.d("RequestId", putResult.getRequestId()); } catch (ClientException e) { // 客户端异常,例如网络异常等。 e.printStackTrace(); } catch (ServiceException e) { // 服务端异常。 Log.e("RequestId", e.getRequestId()); Log.e("ErrorCode", e.getErrorCode()); Log.e("HostId", e.getHostId()); Log.e("RawMessage", e.getRawMessage()); }
- 调用异步接口上传
说明 在Android中,只能在子线程调用、而不能在UI线程调用同步接口,否则将出现异常。如果希望直接在UI线程中上传,请使用异步接口。
以下代码用于以异步方式上传examplefile.txt文件到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。
// 构造上传请求。 // 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件完整路径(例如/storage/emulated/0/oss/examplefile.txt)。 // Object完整路径中不能包含Bucket名称。 PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt"); // 异步上传时可以设置进度回调。 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.d("PutObject", "UploadSuccess"); Log.d("ETag", result.getETag()); Log.d("RequestId", result.getRequestId()); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 请求异常。 if (clientExcepion != null) { // 客户端异常,例如网络异常等。 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服务端异常。 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); // task.cancel(); // 可以取消任务。 // task.waitUntilFinished(); // 等待任务完成。
对于Android10及之后版本的分区存储,您可以使用文件的Uri上传文件到OSS。
// 构造上传请求。 // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。 // Object完整路径中不能包含Bucket名称。 PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", fileUri); // 异步上传时可以设置进度回调。 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.d("PutObject", "UploadSuccess"); Log.d("ETag", result.getETag()); Log.d("RequestId", result.getRequestId()); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 请求异常。 if (clientExcepion != null) { // 客户端异常,例如网络异常等。 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服务端异常。 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); // task.cancel(); // 可以取消任务。 // task.waitUntilFinished(); // 等待任务完成。
上传二进制byte[]数组
以下代码用于以异步方式上传二进制byte[]数组到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。
byte[] uploadData = new byte[100 * 1024]; new Random().nextBytes(uploadData); // 构造上传请求。 // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。 // Object完整路径中不能包含Bucket名称。 PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", uploadData); try { PutObjectResult putResult = oss.putObject(put); Log.d("PutObject", "UploadSuccess"); Log.d("ETag", putResult.getETag()); Log.d("RequestId", putResult.getRequestId()); } catch (ClientException e) { // 客户端异常,例如网络异常等。 e.printStackTrace(); } catch (ServiceException e) { // 服务端异常。 Log.e("RequestId", e.getRequestId()); Log.e("ErrorCode", e.getErrorCode()); Log.e("HostId", e.getHostId()); Log.e("RawMessage", e.getRawMessage()); }