开发者社区 问答 正文

Android-SDK 之如何实现上传文件(一)?


简单上传本地文件


调用同步接口上传:

  1. // 构造上传请求
  2. PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
  3. // 文件元信息的设置是可选的
  4. // ObjectMetadata metadata = new ObjectMetadata();
  5. // metadata.setContentType("application/octet-stream"); // 设置content-type
  6. // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校验MD5
  7. // put.setMetadata(metadata);
  8. try {
  9.     PutObjectResult putResult = oss.putObject(put);
  10.     Log.d("PutObject", "UploadSuccess");
  11.     Log.d("ETag", putResult.getETag());
  12.     Log.d("RequestId", putResult.getRequestId());
  13. } catch (ClientException e) {
  14.     // 本地异常如网络异常等
  15.     e.printStackTrace();
  16. } catch (ServiceException e) {
  17.     // 服务异常
  18.     Log.e("RequestId", e.getRequestId());
  19.     Log.e("ErrorCode", e.getErrorCode());
  20.     Log.e("HostId", e.getHostId());
  21.     Log.e("RawMessage", e.getRawMessage());
  22. }

注意:在Android中,不能在UI线程调用同步接口,只能在子线程调用,否则将出现异常。如果希望直接在UI线程中上传,请使用异步接口。

调用异步接口上传:
  1. // 构造上传请求
  2. PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
  3. // 异步上传时可以设置进度回调
  4. put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
  5.     @Override
  6.     public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
  7.         Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
  8.     }
  9. });
  10. OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
  11.     @Override
  12.     public void onSuccess(PutObjectRequest request, PutObjectResult result) {
  13.         Log.d("PutObject", "UploadSuccess");
  14.         Log.d("ETag", result.getETag());
  15.         Log.d("RequestId", result.getRequestId());
  16.     }
  17.     @Override
  18.     public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
  19.         // 请求异常
  20.         if (clientExcepion != null) {
  21.             // 本地异常如网络异常等
  22.             clientExcepion.printStackTrace();
  23.         }
  24.         if (serviceException != null) {
  25.             // 服务异常
  26.             Log.e("ErrorCode", serviceException.getErrorCode());
  27.             Log.e("RequestId", serviceException.getRequestId());
  28.             Log.e("HostId", serviceException.getHostId());
  29.             Log.e("RawMessage", serviceException.getRawMessage());
  30.         }
  31.     }
  32. });
  33. // task.cancel(); // 可以取消任务
  34. // task.waitUntilFinished(); // 可以等待任务完成


简单上传二进制byte[]数组

  1. byte[] uploadData = new byte[100 * 1024];
  2. new Random().nextBytes(uploadData);
  3. // 构造上传请求
  4. PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadData);
  5. try {
  6.     PutObjectResult putResult = oss.putObject(put);
  7.     Log.d("PutObject", "UploadSuccess");
  8.     Log.d("ETag", putResult.getETag());
  9.     Log.d("RequestId", putResult.getRequestId());
  10. } catch (ClientException e) {
  11.     // 本地异常如网络异常等
  12.     e.printStackTrace();
  13. } catch (ServiceException e) {
  14.     // 服务异常
  15.     Log.e("RequestId", e.getRequestId());
  16.     Log.e("ErrorCode", e.getErrorCode());
  17.     Log.e("HostId", e.getHostId());
  18.     Log.e("RawMessage", e.getRawMessage());
  19. }


上传到文件目录


OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,这个文件可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。
在上传文件时,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。

注意:OSS路径默认是”根目录”,不需要以’/‘开头。


上传Content-Type设置


在Web服务中Content-Type用来设定文件的类型,决定以什么形式、什么编码读取这个文件。某些情况下,对于上传的文件需要设定Content-Type,否则文件不能以自己需要的形式和编码来读取。使用SDK上传文件时,如果不指定Content-Type,SDK会帮您根据后缀自动添加Content-Type。
  1. // 构造上传请求
  2. PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
  3. ObjectMetadata metadata = new ObjectMetadata();
  4. // 指定Content-Type
  5. metadata.setContentType("application/octet-stream");
  6. // user自定义metadata
  7. metadata.addUserMetadata("x-oss-meta-name1", "value1");
  8. put.setMetadata(metadata);
  9. OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
  10.     ...
  11. });


MD5校验设置


如果要校验上传到OSS的文件和本地文件是否一致,可以在上传文件时携带文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器接收到的文件MD5值和Content-MD5一致时才可以上传成功,从而保证上传数据的一致性。
  1. // 构造上传请求
  2. PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
  3. ObjectMetadata metadata = new ObjectMetadata();
  4. metadata.setContentType("application/octet-stream");
  5. try {
  6.     // 设置Md5以便校验
  7.     metadata.setContentMD5(BinaryUtil.calculateBase64Md5("<uploadFilePath>")); // 如果是从文件上传
  8.     // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(byte[])); // 如果是上传二进制数据
  9. } catch (IOException e) {
  10.     e.printStackTrace();
  11. }
  12. put.setMetadata(metadata);
  13. OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
  14.     ...
  15. });












展开
收起
青衫无名 2017-10-18 11:52:09 2965 分享 版权
0 条回答
写回答
取消 提交回答