一、兼单快速集成
1、打开阿里云官网 https://www.aliyun.com并注册账号,然后登陆
2、在阿里云主页选择产品分类,再选择对象存储OSS
3、点击帮助文档开始进行集成
(1)、点击帮助文档进入开发文档界面
(2)在文档目录——>SDK参考——>Android——>安装,这里有几种方式,本人建议最快速简便的方式在app下的build.gradle文件加入依赖,再进行编译就OK了,友情提示:不要忘记加入必要权限和混淆设置哦!
二、初始化配置
1、在配置参数之前最好了解下OSS服务中的基本概念 操作:开发指南——>基本概念
2、创建储存空间 一般这个步骤是由后台来配置,然后会将各种参数给前端(这样的话接下来的第三步就可以照抄了)
(1)打开OSS服务控制台
(2)选择存储空间列表 创建Bucket,配置各类属性
3、配置必要参数 快速入门
(1)、这里最主要的是配置区域地址、空间名字以及OSS服务的app_key和app_secret
(2)文件上传下载处理类 由于我的项目中没有用到STS鉴权模式,用到的是最简便的方式,如有用到鉴权模式的同学,可以参考文档进行集成。这个处理类本人对于单文件上传用的是同步上传的方式,多文件上传用的是异步上传。
public class AliyunOSSUtils {
private static AliyunOSSUtils mOSSUtils;
private UploadListener listener;
private static OSS oss;
/**
* 单一实例
*/
public static AliyunOSSUtils getInstance() {
if (mOSSUtils == null) {
synchronized (AliyunOSSUtils.class) {
if (mOSSUtils == null) {
mOSSUtils = new AliyunOSSUtils();
}
}
}
return mOSSUtils;
}
public AliyunOSSUtils() {
// 配置类如果不设置,会有默认配置。
OSSPlainTextAKSKCredentialProvider provider = new OSSPlainTextAKSKCredentialProvider(MyOSSConfig.OSS_ACCESS_KEY_ID, MyOSSConfig.OSS_ACCESS_KEY_SECRET);
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
oss = new OSSClient(MyApplication.getInstance(), MyOSSConfig.OSS_EXTERNAL_ENDPOINT, provider, conf);
}
/**
* 上传单个文件
*
* @param name
* @param localPath
*/
public String uploadFile(String name, String localPath) {
// 构造上传请求。
PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, name, localPath);
// 异步上传时可以设置进度回调。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
L.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
try {
// 开始同步上传
PutObjectResult result = oss.putObject(put);
L.d("upload: result=" + result);
// 得到一个外网可访问的地址
String url = oss.presignPublicObjectURL(BUCKET_NAME, name);
// if (listener != null)
// listener.onUpLoadComplete(url);
// 格式打印输出
L.e("--------------同步上传:" + url + "-----------");
L.d(String.format("PublicObjectURL:%s", url));
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//上传多个文件
public void upLoadMultipleFile(String name, String path) {
// 构造上传请求。
PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, name, path);
// 异步上传时可以设置进度回调。
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
L.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
Log.d("ETag", result.getETag());
Log.d("RequestId", result.getRequestId());
String url = oss.presignPublicObjectURL(BUCKET_NAME, name);
L.e("图片地址--------------" + url + "-----------------");
if (listener != null)
listener.onUpLoadComplete(url);
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 请求异常。
if (clientExcepion != null) {
// 本地异常,如网络异常等。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服务异常。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // 可以取消任务。
// task.waitUntilFinished(); // 等待上传完成。
}
public void setUpLoadListener(UploadListener listener) {
this.listener = listener;
}
/**
* 下载文件
*
* @param name
*/
public void downLoadFile(String name) {
// 构造下载文件请求。
GetObjectRequest get = new GetObjectRequest(BUCKET_NAME, name);
OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
// 请求成功。
Log.d("asyncGetObject", "DownloadSuccess");
Log.d("Content-Length", "" + result.getContentLength());
InputStream inputStream = result.getObjectContent();
byte[] buffer = new byte[2048];
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// 您可以在此处编写代码来处理下载的数据。
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
// GetObject请求成功,将返回GetObjectResult,其持有一个输入流的实例。返回的输入流,请自行处理。
public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 请求异常。
if (clientExcepion != null) {
// 本地异常,如网络异常等。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服务异常。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.cancel(); // 可以取消任务。
// task.waitUntilFinished(); // 等待任务完成。
}
public interface UploadListener {
void onUpLoadComplete(String url);
}
}
三、具体用法
1、初始化
AliyunOSSUtils ossUtils = AliyunOSSUtils.getInstance();
2、设置上传回调
ossUtils.setUpLoadListener(new AliyunOSSUtils.UploadListener() {
@Override
public void onUpLoadComplete(String url) {
data.put("images[" + upLoadNum + "]", url);
upLoadNum++;
L.e("图片地址2-----" + url + "---------------------");
if (upLoadNum < fileList.size()) {
L.e("上传数量----" + upLoadNum + "-------------");
submit2aliyun(fileList.get(upLoadNum));
} else {
//这里处理所有文件上传成功后的逻辑
}
}
});
3、文件上传
int upLoadNum;
Map<String, String> data = new HashMap<>();
//提交
private void commit() {
if (mList.size() < 1) {
showToast("请添加照片");
return;
}
upLoadNum = 0;
data.clear();
//上传至阿里云
submit2aliyun(fileList.get(upLoadNum));
}
4、这里submit2aliyun()方法用到雪花算法,这里我就不讲解了,如果需要的可以自行去了解,不需要的直接调用多文件上传的方法就OK了!
//上传至阿里云
private void submit2aliyun(File file) {
String name = file.getName();
SnowFlakeWorkId snowId = new SnowFlakeWorkId();
String key = snowId.nextId() + name.substring(name.indexOf("."));
ossUtils.upLoadMultipleFile("gallery/" + key, file.getAbsolutePath());
}
到此就告一段落了。本人新手,第一次写博客,如有错误的地方,还望大家多多指正。如能帮到大家我很欣慰。