开发者社区 问答 正文

Java-SDK 之如何实现上传文件(七)?


Post上传


OSS Java SDK目前暂不支持Post上传Object,示例提供了PostObject的示例程序,您可以直接使用或再示例基础上修改,请参考 PostObjectSample。如果您对Put Object有疑惑请参考OSS Post Object的API,请参考 PostObject。让您在修改或实现Post Object过程中有问题或疑问,请参考 JAVA模拟PostObject表单上传OSS

上传进度条


OSS Java sdk支持进度条功能,指示上传/下载的进度。下面的代码以OSSClient.putObject为例,说明进度条功能的使用。


提示:
  • 上传进度条的完整代码请参考:GitHub
  1. static class PutObjectProgressListener implements ProgressListener {
  2.     private long bytesWritten = 0;
  3.     private long totalBytes = -1;
  4.     private boolean succeed = false;
  5.     @Override
  6.     public void progressChanged(ProgressEvent progressEvent) {
  7.         long bytes = progressEvent.getBytes();
  8.         ProgressEventType eventType = progressEvent.getEventType();
  9.         switch (eventType) {
  10.         case TRANSFER_STARTED_EVENT:
  11.             System.out.println("Start to upload......");
  12.             break;
  13.         case REQUEST_CONTENT_LENGTH_EVENT:
  14.             this.totalBytes = bytes;
  15.             System.out.println(this.totalBytes + " bytes in total will be uploaded to OSS");
  16.             break;
  17.         case REQUEST_BYTE_TRANSFER_EVENT:
  18.             this.bytesWritten += bytes;
  19.             if (this.totalBytes != -1) {
  20.                 int percent = (int)(this.bytesWritten * 100.0 / this.totalBytes);
  21.                 System.out.println(bytes + " bytes have been written at this time, upload progress: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
  22.             } else {
  23.                 System.out.println(bytes + " bytes have been written at this time, upload ratio: unknown" + "(" + this.bytesWritten + "/...)");
  24.             }
  25.             break;
  26.         case TRANSFER_COMPLETED_EVENT:
  27.             this.succeed = true;
  28.             System.out.println("Succeed to upload, " + this.bytesWritten + " bytes have been transferred in total");
  29.             break;
  30.         case TRANSFER_FAILED_EVENT:
  31.             System.out.println("Failed to upload, " + this.bytesWritten + " bytes have been transferred");
  32.             break;
  33.         default:
  34.             break;
  35.         }
  36.     }
  37.     public boolean isSucceed() {
  38.         return succeed;
  39.     }
  40. }
  41. public static void main(String[] args) {
  42.     String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  43.     String accessKeyId = "<accessKeyId>";
  44.     String accessKeySecret = "<accessKeySecret>";
  45.     String bucketName = "<bucketName>";
  46.     String key = "object-get-progress-sample";
  47.     OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  48.     try {            
  49.         // 带进度条的上传
  50.         ossClient.putObject(new PutObjectRequest(bucketName, key, new FileInputStream("<yourLocalFile>")).
  51.                 <PutObjectRequest>withProgressListener(new PutObjectProgressListener()));
  52.     } catch (Exception e) {
  53.         e.printStackTrace();
  54.     }
  55.     ossClient.shutdown();
  56. }

提示:
  • putObject/getObject/uploadPart都支持进度条功能;
  • uploadFile/downloadFile不支持进度条功能。


上传回调


OSS在上传文件完成的时候可以提供回调(Callback)给应用服务器。用户只需要在发送给OSS的请求中携带相应的Callback参数,即能实现回调。现在支持CallBack的接口有:PutObject、PostObject、CompleteMultipartUpload。
上传回调的一种典型应用场景是与授权第三方上传同时使用,客户端在上传文件到OSS的时候指定到服务器端的回调,当客户端的上传任务在OSS执行完毕之后,OSS会向应用服务器端主动发起HTTP请求进行回调,这样服务器端就可以及时得到上传完成的通知从而可以完成诸如数据库修改等操作,当回调请求接收到服务器端的响应之后OSS才会将状态返回给客户端。
您想了解上传回调的更详细信息,请参考 上传回调。下面以PutObject为例说明上传回调的用法。

提示:
  • 上传回调的完整代码请参考:GitHub
  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 您的回调服务器地址,如http://oss-demo.aliyuncs.comhttp://127.0.0.1:9090
  8. String callbackUrl = "<yourCallbackServerUrl>";
  9. // 创建OSSClient实例
  10. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  11. String content = "Hello OSS";
  12. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, "key",
  13.         new ByteArrayInputStream(content.getBytes()));
  14. // 上传回调参数
  15. Callback callback = new Callback();
  16. callback.setCallbackUrl(callbackUrl);
  17. callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com");
  18. callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
  19. callback.setCallbackBodyType(CallbackBodyType.JSON);
  20. callback.addCallbackVar("x:var1", "value1");
  21. callback.addCallbackVar("x:var2", "value2");
  22. putObjectRequest.setCallback(callback);
  23. PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
  24. // 读取上传回调返回的消息内容
  25. byte[] buffer = new byte[1024];
  26. putObjectResult.getCallbackResponseBody().read(buffer);
  27. // 一定要close,否则会造成连接资源泄漏
  28. putObjectResult.getCallbackResponseBody().close();
  29. // 关闭client
  30. ossClient.shutdown();

提示:
  • 上传回调的中的参数,请参考上传回调中的说明;
  • 上传回调返回的消息体一定要close,否则会造成连接资源泄漏。

展开
收起
青衫无名 2017-10-18 10:49:35 2041 分享 版权
0 条回答
写回答
取消 提交回答