这是一篇关于 上传oss图片的工具类,单张上传很简单,关键在于批量上传图片,对于有这方面需求的同学,应该会有所帮助。
老规矩 官方文档:OSS的兼容性和SDK源码_对象存储(OSS)-阿里云帮助中心,里面有详细说明,对应如何构建单张图片上传。
背景:测试说:“小程序支持多图上传,为啥安卓不支持?”。 ok 我们也支持一下
图片批量上传过程拆解:
1、图片批量选择
2、图片批量压缩
3、图片批量上传
这里重点是 步骤2、3的汇总。步骤1可以自行选择。
步骤1:
采用三方插件:
GitHub - LuckSiege/PictureSelector: Picture Selector Library for Android or 图片选择器
PictureSelector.create()等方法选择图片,这里可以去官方库学习了解。
从步骤1获得 本地图片列表:List<LocalMedia> result
LocalMedia :可以自己定义,包含 localPath 就行。
然后进行步骤2 批量压缩,这里采用的是Luban批量压缩:
private void compressImages(List<LocalMedia> localMediaList,String BUCKET_NAME) { if(localMediaList == null || localMediaList.size()<1) { return; } List<String> compressList = new ArrayList<>(); Luban.with(SolApplication.getInstance()) .load(getFilesPath(localMediaList)) .ignoreBy(500) .filter(new CompressionPredicate() { @Override public boolean apply(String path) { return PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path); } }) // .setRenameListener(new OnRenameListener() { // @Override // public String rename(String filePath) { // LdwLogUtil.e("压缩重命名:" + filePath); // return null; // } // }) .setCompressListener(new OnCompressListener() { @Override public void onStart() { } @Override public void onSuccess(int index, File file) { LogUtil.e(index+"压缩成功:" + file.getAbsolutePath()); compressList.add(file.getAbsolutePath()); if(index == localMediaList.size()-1) { finalTenderOssSigneUpList = new ArrayList<>(); asyncListPutImage(compressList,BUCKET_NAME,initOssClent()); } } @Override public void onError(int index, Throwable e) { Message mes = handler.obtainMessage(3, null); handler.sendMessage(mes); LogUtil.e("压缩失败" ); } }).launch(); }
压缩提一个点:可以点进源码看看具体啥时候会走压缩失败的回调,会有惊喜!也会影响你写代码的逻辑
批量压缩完成后就开始步骤3,批量上传,采用的是递归的办法:
private OSS initOssClent () { OSSCredentialProvider credentialProvider = new MyOSSAuthCredentialsProvider(stsServer); conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒 conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒 conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个 conf.setMaxErrorRetry(2); //