公司的项目需要移动端使用OSS上传图片,对图片进行统一管理,减轻服务端的压力。所以我封装了一个OSS上传图片的工具类,这里做个记录,供自己和其他同仁使用。
首先我们先把库引进来
implementation 'com.aliyun.dpa:oss-android-sdk:+'
接着就是我们的工具类接口了
public interface IOssCallBack {
public void progress(int progress);//进度回调接口
public void success();//成功回调接口
public void failure();//失败回调接口
}
下来是工具类了
public class OssUtils {
private static OssUtils ossUtils;
private static OSS oss;
private static SharedPreferences sps;
private static ClientConfiguration conf;
private static OSSCredentialProvider credetialProvider;
/**
* 初始化oss对象,这个里面因为有网络请求,需要在我们使用的时候再进行初始化。
*/
public static OssUtils getInstance(Context context) {
if (ossUtils == null) {
ossUtils = new OssUtils();
//共享参数初始化
sps = context.getSharedPreferences("clouddriver", Context.MODE_PRIVATE);
//设置配置文件
conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
}
return ossUtils;
}
/**
* 单图上传方法
*
* @param path
* @param name
* @param callBack
*/
public void uploadPicByPath(Context context, String path, String name, IOssCallBack callBack) {
if (ossUtils != null) {
OkGo.get((String) Latte.init().getHash().get(ConfigType.OSS_KEY.name()))
.tag(this)
.headers("Content-Type", "application/json")
.headers("Authorization", "Bearer " + sps.getString("access_token", ""))
.params("key", "cloudStsToken")
.execute(new MyCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
OssEntity ossEntity = new Gson().fromJson(s, OssEntity.class);
String ak = ossEntity.getData().getAccessKeyId();
String sk = ossEntity.getData().getAccessKeySecret();
String token = ossEntity.getData().getSecurityToken();
String expiration = ossEntity.getData().getExpiration();
credetialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
// 配置类如果不设置,会有默认配置。
oss = new OSSClient(context, "oss-cn-beijing.aliyuncs.com", credetialProvider, conf);
//开始上传工作
PutObjectRequest put = new PutObjectRequest("clouds1000", name, path);
// 异步上传时可以设置进度回调。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
callBack.progress((int) (((double) currentSize / (double) totalSize) * 100));
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
callBack.success();
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
callBack.failure();
}
});
}
@Override
public void MyOnError(Call call, Response response, Exception e, String errorMsg) {
ToastUtil.showViewToast(context, "请检查您的网络");
}
});
}
}
/**
* OSS多图上传
* @param context
* @param pathList
*/
public void multiUploadPicByPath(Context context,List<PicUpLoadBean> pathList){
if (ossUtils != null) {
OkGo.get((String) Latte.init().getHash().get(ConfigType.OSS_KEY.name()))
.tag(this)
.headers("Content-Type", "application/json")
.headers("Authorization", "Bearer " + sps.getString("access_token", ""))
.params("key", "cloudStsToken")
.execute(new MyCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
OssEntity ossEntity = new Gson().fromJson(s, OssEntity.class);
String ak = ossEntity.getData().getAccessKeyId();
String sk = ossEntity.getData().getAccessKeySecret();
String token = ossEntity.getData().getSecurityToken();
String expiration = ossEntity.getData().getExpiration();
credetialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
// 配置类如果不设置,会有默认配置。
oss = new OSSClient(context, "oss-cn-beijing.aliyuncs.com", credetialProvider, conf);
//这里开始进行一个循环
for (int i=0;i<pathList.size();i++) {
IOssCallBack callBack = pathList.get(i).getCallBack();
String name = pathList.get(i).getPicName();
String path = pathList.get(i).getPicPath();
//开始上传工作
PutObjectRequest put = new PutObjectRequest("clouds1000", name, path);
// 异步上传时可以设置进度回调。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
callBack.progress((int) (((double) currentSize / (double) totalSize) * 100));
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
callBack.success();
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
callBack.failure();
}
});
}
}
@Override
public void MyOnError(Call call, Response response, Exception e, String errorMsg) {
ToastUtil.showViewToast(context, "请检查您的网络");
}
});
}
}
}
实体类PicUpLoadBean
public class PicUpLoadBean {
private String picName;
private String picPath;
private int picProgress;
private IOssCallBack callBack;
public String getPicName() {
return picName;
}
public void setPicName(String picName) {
this.picName = picName;
}
public String getPicPath() {
return picPath;
}
public void setPicPath(String picPath) {
this.picPath = picPath;
}
public int getPicProgress() {
return picProgress;
}
public void setPicProgress(int picProgress) {
this.picProgress = picProgress;
}
public IOssCallBack getCallBack() {
return callBack;
}
public void setCallBack(IOssCallBack callBack) {
this.callBack = callBack;
}
}
单图上传调用
String objectName = "android" + sps.getInt("user_id", 0) + System.currentTimeMillis();
dialogWeb.show();
OssUtils.getInstance(this).uploadPicByPath(this,UriToPathUtil.getRealFilePath(this, resultUri), objectName, new IOssCallBack() {
@Override
public void progress(int progress) {
Log.i("myoss", progress + "");
}
@Override
public void success() {
dialogWeb.dismiss();
Log.i("myoss", "success");
}
@Override
public void failure() {
dialogWeb.dismiss();
Log.i("myoss", "failure");
}
});
多图上传调用
OssUtils.getInstance(this).multiUploadPicByPath(this,picList);
这个list的每一个对象对应一个图片,其中包含了图片的ObjectName,路径,上传进度和对应的接口回调,用的时候直接拿出来用就可以了,多张图片不会发生冲突。OSS默认多线程上传。需要注意的一点,这个回调是子线程,如果要更新UI需要配合Handler进行使用。