一、oos简介 

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

官网文档地址 :https://help.aliyun.com/document_detail/31883.html?spm=a2c4g.11186623.6.560.71c865d307nMqB

Android的SDK使用的github地址:https://github.com/aliyun/aliyun-oss-android-sdk

二 、使用

1 依赖

在AS中build中添加依赖,代码如下:

compile 'com.aliyun.dpa:oss-android-sdk:+'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.9.0'

引入okhttp 以及okio,是因为,利用oss上传文件利用的okttp,所以必须依赖 ,只有build一下,尝试是否可以导入关于oss的API

本人在使用时无build之后无法导入oss的API,之后就直接导入了他的jar包,关于jar的编译在github上有说明,或者直接去找下载也可,然后导入到lib之后依赖即可。

2 AndroidManifest权限配置

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

3 混淆设置

-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**

4 原理介绍

上面的图直接用的官网的介绍图,如果是首次一定得看清楚上面的图,从移动端开始,角色分析如下:

  • 1 移动端向应服务器请求STS凭证(为了安全)
  • 2 服务器向oss端请求所需的凭证
  • 3 oss将STS凭证返回应用服务器
  • 4 应用服务器将STS返回给移动端
  • 5 移动端使用STS进行文件上传
  • 6 OSS将上传结果返回给移动端

注意 : 过程5移动端上传的时候可以设置给应用服务器的回调地址和自定义参数,这样移动端上传到oss之后,会上传结果发到到应用服务器,服务器同时可以设置移动应用所需要的数据,在oss上传成功的回调中传给移动应用

具体代码如下,在代码中看具体逻辑:

/*** 步骤1 首先创建对象*     2 调用initOss 初始化oss 相关*     3 上传文件*     视频上传到Oss的流程  本地请求服务器获取accessKeyId,accessKeySecret,securityToken --->上传文件到OSS服务器的同时*     并设置本司服务器的回调地址*     ---> 上传成功后oss会根据之前设置的回调通知本司服务器 本地也会收到关于oss的上传回调**     STS 鉴权服务器地址,使用前请参照文档           https://help.aliyun.com/document_detail/31920.html*/public class AliYunOssUploadOrDownFileConfig {private static final String TAG = AliYunOssUploadOrDownFileConfig.class.getSimpleName();private static AliYunOssUploadOrDownFileConfig aliyunOssUploadFileUtil;/*** 服务器的地址   */private static final String ENDPOINT =  "http://oss-cn-beijing.aliyuncs.com";private ClientConfiguration conf = null;private OSS oss = null;private PutObjectRequest put = null;private OSSAsyncTask task = null;private OnUploadFile onUploadFile;public static final String CALLBACK_URL = "callbackUrl";public static final String CALLBACK_BODY = "callbackBody";/*** callback 的回调地址 eg : "http://oss-demo.aliyuncs.com:23450";* 通过这个地址oss可以将所需要的数据传到应用服务器,服务器就可以根据上传的参数为所欲为了*/private String mCallbackAddress = "http://oss-demo.aliyuncs.com:23450";private Context mContext;private AliYunOssUploadOrDownFileConfig(Context context){this.mContext = context;}public static AliYunOssUploadOrDownFileConfig getInstance(Context context) {if(aliyunOssUploadFileUtil == null) {synchronized (AliYunOssUploadOrDownFileConfig.class) {if(aliyunOssUploadFileUtil == null) {aliyunOssUploadFileUtil = new AliYunOssUploadOrDownFileConfig(context);}}}return aliyunOssUploadFileUtil;}/*** 调用这个方法之前必须先设置accessKeyId,accessKeySecret,securityToken;*/public  void initOss( String accessKeyId,String accessKeySecret,String securityToken){conf = new ClientConfiguration();conf.setConnectionTimeout(5*60*1000);conf.setSocketTimeout(5*60*1000);conf.setMaxConcurrentRequest(5);conf.setMaxErrorRetry(2);OSSLog.enableLog();//请求后台服务器返回//    "StatusCode":200,//    "AccessKeyId":"STS.3p***dgagdasdg",//    "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI",//   "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=",//   "Expiration":"2017-12-12T07:49:09Z",OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret,securityToken);oss = new OSSClient(mContext,ENDPOINT,credentialProvider,conf);}/*** 上传文件* @param bucketName oss上所建的仓库名称  eg : smartDev 如果设置的合理,将会报错,oss会提示说设置的bucketName不可用* @param objectKey oss上所存储文件的名称 eg: vic/test/xxx.mp4* @param uploadFilePath 本地存储文件的路径*/public void uploadFile(String bucketName, String objectKey,String uploadFilePath, final String filename, final int reminderId){put = new PutObjectRequest(bucketName,objectKey,uploadFilePath);ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType("application/octet-stream");put.setMetadata(metadata);put.setCRC64(OSSRequest.CRC64Config.YES);if(!TextUtils.isEmpty(mCallbackAddress)) {put.setCallbackParam(new HashMap<String, String>(){{//这里 filename 中的object 不用替换,如果到oss了,object 将自动在服务器自动被上传文件名替换 并且是全路径名称put(CALLBACK_URL,mCallbackAddress);put(CALLBACK_BODY,"filename=${object}"+ "&reminder_id=${x:" + reminderId + "}");
//                    put(CALLBACK_BODY,"filename=${object}");}});}put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {@Overridepublic void onProgress(PutObjectRequest request, long currentSize, long totalSize) {Log.d(TAG, "currentSize: " + currentSize + " totalSize: " + totalSize);}});task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {@Overridepublic void onSuccess(PutObjectRequest request, PutObjectResult result) {Log.d(TAG,"uploadSuccess");if(onUploadFile != null) {onUploadFile.onUploadFileSuccess("上传成功");}}@Overridepublic void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {if(onUploadFile != null) {try{if(serviceException != null) {onUploadFile.onUploadFileFailed(serviceException.toString());} else {onUploadFile.onUploadFileFailed("上传失败");}}catch (Exception e) {onUploadFile.onUploadFileFailed("上传失败");}}// Request exceptionif (clientException != null) {// Local exception, such as a network exceptionclientException.printStackTrace();}if (serviceException != null) {// Service exceptionLog.d(TAG,"ErrorCode="+ serviceException.getErrorCode());Log.d(TAG,"RequestId=" + serviceException.getRequestId());Log.d(TAG,"HostId=" + serviceException.getHostId());Log.d(TAG,"RawMessage=" + serviceException.getRawMessage());}}// task.cancel(); // Cancel the task// task.waitUntilFinished(); // Wait till the task is finished});}public void setOnUploadFile(OnUploadFile onUploadFile) {this.onUploadFile = onUploadFile;}public interface OnUploadFile {void onUploadFileSuccess(String info);void onUploadFileFailed(String errCode);}}

以上就是移动应用上传文件的一些大概逻辑了,注意:

移动端所需服务端提的参数 STS凭证的三个参数 accessKeyId,accessKeySecret,securityToken

所用的oss服务器的地址endPoint,bucketName oss上的名称,objectKey oss上所存储文件的名称 eg: vic/test/xxx.mp4 前半段由服务器提供,最好在请求STS的时候返回给移动端(这样后期服务器迁移也不会出现问题,),后一部分xxx 文件名自行解决,但是要保证文件名称唯一,查找使用, uploadFilePath 本地存储文件的路径

总结

使用oss传输文件,效率高,成本低,使用和其他的三方SDK一样,必须仔细阅读文档,然后阅读官方提供的sample,基本能保证顺利完成

Android Oss上传文件简单使用相关推荐

  1. 文件服务器异常 选择签名,OSS上传文件后,服务器签名验证失败

    关于 OSS上传文件后,服务器签名验证失败的搜索结果 回答 指定该Header后,在响应头中也会返回该Header,OSS会对上传的Object进行加密编码存储,当这个Object被下载时,响应头中会 ...

  2. SpringBoot整合阿里云OSS上传文件

    一.需求分析 文件上传是一个非常常见的功能,就是通过IO流将文件写到另外一个地方,这个地方可以是项目下的某个文件夹里,或者是本地电脑某个盘下面,还可以是云服务OSS里面,这里就是我要讲到的OSS,我写 ...

  3. thinkPHP 阿里云OSS 上传文件、直接下载

    阿里云OSS 上传文件.直接下载 1. 安装OSS SDK composer require aliyuncs/oss-sdk-php 2. thinkPHP接口 public function up ...

  4. springboot集成阿里OSS上传文件

    开发前的准备: 自己在阿里云上申请免费的Oss对象存储,新建Bucket---读写权限选择公共读,我开始这里忘了导致后来踩了小坑 接下来是代码中的一些配置:我用的是springboot 1>添加 ...

  5. SringBoot集成阿里云OSS上传文件

    上一篇文章讲了如何将文件从linux同步到阿里云的oss有兴趣的小伙伴可以去看看,这篇文章讲述如何将文件上传到阿里云oss上,本文只详细写出后端java代码示例,前端和无用代码都会省略,可以上传文件, ...

  6. 阿里云OSS上传文件以及获取文件

    1.新建bucket (文件存储空间名称),bucket下也可以继续创建目录 2.通过短信验证码创建accessKey,保存accessKeyID和accessKeySecret: 3.添加oss管理 ...

  7. 阿里云OSS上传文件并返回文件地址

    目录 依赖添加 实体类: OSS配置类: OSSUtil工具类: OSS上传接口类: OSS上传接口实现类: OSS上传控制类: 工具类: 依赖添加 在Maven的pom.xml文件中添加OSS的依赖 ...

  8. 阿里云OSS上传文件时,如何显示上传网速

    阿里云OSS上传文件时,如何显示上传网速 业务场景 用户上传时,网速很慢,或者在上传大文件时,虽然有进度条,但是动的很慢,或者不明显,用户会产生困惑. 所以就产生了一个显示网速的需求点. 实现方式 E ...

  9. Java实现阿里云OSS上传文件

    推荐:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.. 点击跳转到网站 1.准备工作:创建操作阿里云OSS许可证 阿里云官方文档 这里不再赘述,根据官方文档一步步的 ...

最新文章

  1. 雷林鹏分享:Lua 数据库访问
  2. 软件测试-PR录制脚本程序的时候出现license invalid,error code=-13或者-24的错误
  3. ABAP:为Table Control创建Context Menu
  4. Construct Binary Tree from Preorder and Inorder Traversal
  5. rostcm6情感分析案例分析_卷积情感分析
  6. 交换机组网常见九大故障问题
  7. Java面向对象第二章课后习题
  8. 信息学奥赛一本通(1043:整数大小比较)
  9. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
  10. linux通过光盘安装命令包,RHEL5通过光盘配置本地yum仓库及命令详解
  11. [翻译] 用 CSS 背景混合模式制作高级效果
  12. 10 个实战与面试【常用 Shell 脚本】编写
  13. 草稿草稿草稿22.10.9 “yuyu“ IO进程线程
  14. 微信小程序二手汽车拍卖系统丨可以android studio运行
  15. [计算机数值分析]直线拟合的最小二乘法
  16. Java 生成13位条形码 Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。
  17. 2022最新Emlog新版导航源码 带用户中心
  18. 大专计算机应用论文摘要,计算机应用大专论文摘要怎么写 计算机应用大专论文摘要范文参考...
  19. Direct2D学习方法
  20. 树和森林的遍历 (树的建立和输出)

热门文章

  1. 环境科学与生态学SCI期刊 高录用推荐
  2. python数据分析与应用课后实训_python数据分析与应用
  3. 华为技术服务工程师实习生面试(已拿到offer)
  4. 报错与解决 | AttributeError: ‘Series‘ object has no attribute ‘set_value‘
  5. 金蝶EAS服务器安装局部补丁时,提示无法安装
  6. 攻防世界逆向入门题之no-strings-attached
  7. php curl get 返回空,php-cURL从有效url返回空输出-没有错误报告
  8. 七牛云对象存储绑定个人域名
  9. (二)亚马孙或当当网在线电子书的购买与转换:改善C#的157个建议、改善C++的150个建议、改善JavaScript的150个建议、改善Java的151个建议
  10. 报错:attributes are not compatible with the provided attributes