使用安卓SDK下载OSS对象时出现超时-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用安卓SDK下载OSS对象时出现超时 已解决

展开
收起
2018-02-10 03:18:20 1251 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    简单下载

    下载指定文件,下载后将获得文件的输入流,此操作要求用户对该Object有读权限。同步调用:

    1. //构造下载文件请求
    2. GetObjectRequest get = new GetObjectRequest("<bucketName>", "<objectKey>");
    3. //设置下载进度回调
    4. get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
    5. @Override
    6. public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
    7. OSSLog.logDebug("getobj_progress: " + currentSize+" total_size: " + totalSize, false);
    8. }
    9. });
    10. try {
    11. // 同步执行下载请求,返回结果
    12. GetObjectResult getResult = oss.getObject(get);
    13. Log.d("Content-Length", "" + getResult.getContentLength());
    14. // 获取文件输入流
    15. InputStream inputStream = getResult.getObjectContent();
    16. byte[] buffer = new byte[2048];
    17. int len;
    18. while ((len = inputStream.read(buffer)) != -1) {
    19. // 处理下载的数据,比如图片展示或者写入文件等
    20. }
    21. // 下载后可以查看文件元信息
    22. ObjectMetadata metadata = getResult.getMetadata();
    23. Log.d("ContentType", metadata.getContentType());
    24. } catch (ClientException e) {
    25. // 本地异常如网络异常等
    26. e.printStackTrace();
    27. } catch (ServiceException e) {
    28. // 服务异常
    29. Log.e("RequestId", e.getRequestId());
    30. Log.e("ErrorCode", e.getErrorCode());
    31. Log.e("HostId", e.getHostId());
    32. Log.e("RawMessage", e.getRawMessage());
    33. } catch (IOException e) {
    34. e.printStackTrace();
    35. }

    异步调用:

    1. GetObjectRequest get = new GetObjectRequest("<bucketName>", "<objectKey>");
    2. //设置下载进度回调
    3. get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
    4. @Override
    5. public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
    6. OSSLog.logDebug("getobj_progress: " + currentSize+" total_size: " + totalSize, false);
    7. }
    8. });
    9. OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
    10. @Override
    11. public void onSuccess(GetObjectRequest request, GetObjectResult result) {
    12. // 请求成功
    13. InputStream inputStream = result.getObjectContent();
    14. byte[] buffer = new byte[2048];
    15. int len;
    16. try {
    17. while ((len = inputStream.read(buffer)) != -1) {
    18. // 处理下载的数据
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. @Override
    25. public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
    26. // 请求异常
    27. if (clientExcepion != null) {
    28. // 本地异常如网络异常等
    29. clientExcepion.printStackTrace();
    30. }
    31. if (serviceException != null) {
    32. // 服务异常
    33. Log.e("ErrorCode", serviceException.getErrorCode());
    34. Log.e("RequestId", serviceException.getRequestId());
    35. Log.e("HostId", serviceException.getHostId());
    36. Log.e("RawMessage", serviceException.getRawMessage());
    37. }
    38. }
    39. });

    图片处理

    OSS图片处理,是OSS对外提供的海量、安全、低成本、高可靠的图片处理服务。用户将原始图片上传保存到OSS,通过简单的 RESTful 接口,在任何时间、任何地点、任何互联网设备上对图片进行处理。图片处理提供图片处理接口,图片上传请使用上传接口。基于OSS图片处理,用户可以搭建自己的图片处理服务。

    OSS图片处理提供以下功能:

    SDK中使用时,只需要在下载图片时,调用request.setxOssProcess()方法设置处理参数。示例:

    1. // 构造图片下载请求
    2. GetObjectRequest get = new GetObjectRequest("<bucketName>", "example.jpg");
    3. // 图片处理
    4. request.setxOssProcess("image/resize,m_fixed,w_100,h_100");
    5. OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
    6. @Override
    7. public void onSuccess(GetObjectRequest request, GetObjectResult result) {
    8. // 请求成功
    9. InputStream inputStream = result.getObjectContent();
    10. byte[] buffer = new byte[2048];
    11. int len;
    12. try {
    13. while ((len = inputStream.read(buffer)) != -1) {
    14. // 处理下载的数据
    15. }
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. @Override
    21. public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
    22. // 处理异常
    23. }
    24. });

    需要对图片进行其它处理,只要替换request.setxOssProcess()的参数就可以了。需要帮助,请参考:

    • 可视化图片处理工具 ImageStyleViever ,可以直观的看到OSS图片处理的结果
    • OSS图片处理的功能、使用演示 页面

    指定范围下载

    您可以在下载文件时指定一段范围,对于较大的Object适于使用此功能;如果在请求头中使用Range参数,则返回消息中会包含整个文件的长度和此次返回的范围。如:

    1. GetObjectRequest get = new GetObjectRequest("<bucketName>", "<objectKey>");
    2. // 设置范围
    3. get.setRange(new Range(0, 99)); // 下载0到99字节共100个字节,文件范围从0开始计算
    4. // get.setRange(new Range(100, Range.INFINITE)); // 下载从100个字节到结尾
    5. OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
    6. @Override
    7. public void onSuccess(GetObjectRequest request, GetObjectResult result) {
    8. // 请求成功
    9. InputStream inputStream = result.getObjectContent();
    10. byte[] buffer = new byte[2048];
    11. int len;
    12. try {
    13. while ((len = inputStream.read(buffer)) != -1) {
    14. // 处理下载的数据
    15. }
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. @Override
    21. public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
    22. // 请求异常
    23. if (clientExcepion != null) {
    24. // 本地异常如网络异常等
    25. clientExcepion.printStackTrace();
    26. }
    27. if (serviceException != null) {
    28. // 服务异常
    29. Log.e("ErrorCode", serviceException.getErrorCode());
    30. Log.e("RequestId", serviceException.getRequestId());
    31. Log.e("HostId", serviceException.getHostId());
    32. Log.e("RawMessage", serviceException.getRawMessage());
    33. }
    34. }
    35. });

    只获取文件元信息

    通过headObject方法可以只获文件元信息而不获取文件的实体。代码如下:

    1. // 创建同步获取文件元信息请求
    2. HeadObjectRequest head = new HeadObjectRequest("<bucketName>", "<objectKey>");
    3. OSSAsyncTask task = oss.asyncHeadObject(head, new OSSCompletedCallback<HeadObjectRequest, HeadObjectResult>() {
    4. @Override
    5. public void onSuccess(HeadObjectRequest request, HeadObjectResult result) {
    6. Log.d("headObject", "object Size: " + result.getMetadata().getContentLength());
    7. Log.d("headObject", "object Content Type: " + result.getMetadata().getContentType());
    8. }
    9. @Override
    10. public void onFailure(HeadObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
    11. // 请求异常
    12. if (clientExcepion != null) {
    13. // 本地异常如网络异常等
    14. clientExcepion.printStackTrace();
    15. }
    16. if (serviceException != null) {
    17. // 服务异常
    18. Log.e("ErrorCode", serviceException.getErrorCode());
    19. Log.e("RequestId", serviceException.getRequestId());
    20. Log.e("HostId", serviceException.getHostId());
    21. Log.e("RawMessage", serviceException.getRawMessage());
    22. }
    23. }
    24. });
    25. // task.waitUntilFinished();

    数据完整性校验

    因为移动端网络环境的复杂性,数据在客户端和服务器之间传输时有可能会出错。因此OSS SDK提供了基于CRC的端到端的数据完整性效验。

    CRC校验在读取下载数据流的时候,如果开启了crc效验,会在数据流读取完毕后自动验证数据完整性。

    1. GetObjectRequest request = new GetObjectRequest(OSSTestConfig.ANDROID_TEST_BUCKET, testFile);
    2. //开启CRC效验
    3. request.setCRC64(OSSRequest.CRC64Config.YES);
    4. //....
    5. try{
    6. GetObjectResult result = oss.getObject(request);
    7. InputStream in = result.getObjectContent();
    8. ByteArrayOutputStream output = new ByteArrayOutputStream();
    9. byte[] buffer = new byte[BUFFER_SIZE];
    10. int len;
    11. while ((len = in.read(buffer)) > -1) {
    12. output.write(buffer, 0, len);
    13. }
    14. output.flush();
    15. in.close();
    16. }catch(ClientException e){
    17. //...
    18. }catch(InconsistentException e){
    19. //....
    20. }
    2018-02-15 15:23:32
    赞同 展开评论 打赏
问答排行榜
最热
最新
相关电子书
更多
从 SDK 到编解码:视频直播架构解析
立即下载
跨平台的云服务SDK需要什么
立即下载
一个跨平台的云服务SDK需要什么
立即下载