关于阿里云oss图片批量上传问题解析
背景
最近在项目开发过程中遇到的问题,消耗了比较久的时间,过程曲折,虽然最终达到目的,但是鉴于各种常用的云数据在对象存储方面大同小异,所以记录一下。
理一下思路:
我们在调用第三方对象存储API的时候,通常需要解决以下问题:
1.考虑通用性
2.在调用API过程中需要的参数.
3.如何处理数据(使用方式、成功与失败)
4.调用过程中的异常处理
通用性
在整个App中好几个界面都涉及到图片上传,根据每个界面上传的特点,将其整合成了一个工具类。
参数
阅读阿里云的API以及SDK文档,找关键字,事实证明这样真不好,发现几个重要的字段:Endpoint、Bucket、STS、OssClient、KeyObject、Meta、data、OSSAsyncTask,我理解就是拿一个地址一层层找文件,完整的url长这样:
“http://” +BucketName+ “.” +END_POINT + “/” + ObjectKey
1.EndPoint:Oss区域地址 Bucket:里面的容器,放文件(Object)的地方,这里提一下bucketname
2.KeyObject:上传文件在oss中的名称
3.Meta:上传文件的自我描述,算是标记,为name-value类型 data:这个就是字面上的意思
4.data:字面上的意思
5.STS:鉴权方式,关于这个方式的安全性以及涉及到的参数及其含义详见OSS文档。
6.OssClient:看到Client其实你就能联想到网络请求
7.OSSAsyncTask:异步任务,最终我就是差点当在这里,
看漏一句话:该任务属于安全上传,适用于高并发执行...我居然写到末尾把它硬生生写成同步,捂脸...
数据处理
图片上传过程中,每张图片的上传进度,成功与失败的数据返回处理,
上传过程中可能会出现的问题:比如说正在上传的图片被用户删了之类的等等。
准备工作
1.下载jar包:aliyun-oss-sdk-android-2.3.0.jar、okhttp-3.x.x.jar 和 okio-1.x.x.jar,加入libs中
2.设置权限:在manifests.xml中加入:
<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>
代码片段:
public class PictureUpload {
private static PictureUpload pictureUpload;
/**
* 上传client
*/
OSS oss;
/**
* 上传次数
*/
int number;
/**
* 成功上传(本地文件名作为key,阿里云地址为value)
*/
Map<String, Object> success = new HashMap<>();
/**
* 失败上传(返回失败文件的本地地址)
*/
List<String> failure = new ArrayList<>();
/**
* 上传回调
*/
UploadListener uploadListener;
/**
* 上传任务列表
*/
List<OSSAsyncTask> ossAsyncTasks = new ArrayList<>();
/**
* 自动更新Token
*/
OSSCredentialProvider credetialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
try {
//阿里鉴权请求
AliAuthRes res = new JsonDefaultRequest(AliAuthRes.class).POST("", null, SharePerefrence.getTokenKey());
return new OSSFederationToken(res.getAccessKeyId(), res.getAccessKeySecret(), res.getSecurityToken(), res.getExpiration());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};