一、兼单快速集成
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()); } 到此就告一段落了。本人新手,第一次写博客,如有错误的地方,还望大家多多指正。如能帮到大家我很欣慰。