Android端使用阿里OSS上传
最近一直没更新博客,因为都写到了公司的wiki上,我觉得博客是有必要的,记录一下自己成长过程中的一点一滴吧。
这节课,说一下阿里的OSS,可能会有一点坑。 还有我自己封装的一个比较low的工具类。
我们选择了将文件直接上传到OSS,然后拿到文件的url,将url交给服务器保存。这样一来就大大减少了服务器的压力。
直接上自己封装的工具类代码吧。(直接拿去就可以用)
1.配置依赖:
compile'com.aliyun.[dpa:oss-android-sdk:+](http://dpaoss-android-sdk+/)'//这里用sdk+ 是为了随时跟随oss的版本更新,oss也会随时修复bug。 compile'com.squareup.[okhttp3:okhttp:3.4.1](http://okhttp3okhttp:3.4.1/)'//
由于OSS底层封装是ok,所以ok的依赖也得有
compile'com.squareup.[okio:okio:1.9.0](http://okiookio:1.9.0/)'
2.********这里权限就不贴代码了,什么网络权限,文件读取权限记得不要少。***********
3.然后是混淆(很重要)
-keep class com.alibaba.sdk.android.oss.** { *; } -dontwarn okio.** -dontwarn org.apache.commons.codec.binary.**
4.然后就是代码了
/** * Created by yangjinyang on 2018/4/19. * 姓名:杨阿阳阿阳 * 类说明:Oss上传工具类 */ public class MyOSSUtils { private static MyOSSUtilsinstance; private final StringP_ENDPOINT ="http://oss-cn-beijing.aliyuncs.com";//主机地址(OSS文档中有提到) private final StringP_STSSERVER = UrlHelper.BASE_URL +"get_aliyun_oss_sts";(服务器域名) private final StringP_BUCKETNAME ="文件夹名字";(文件夹名字) private OSSoss; private SimpleDateFormatsimpleDateFormat; public MyOSSUtils() { } public static MyOSSUtils getInstance() { if (instance ==null) { if (instance ==null) { return new MyOSSUtils(); } } return instance; } private void getOSs(Context context) { //推荐使用OSSAuthCredentialsProvider。token过期可以及时更新 OSSCredentialProvider credentialProvider =new OSSAuthCredentialsProvider(P_STSSERVER); //该配置类如果不设置,会有默认配置,具体可看该类 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(context,P_ENDPOINT, credentialProvider); if (simpleDateFormat==null){ simpleDateFormat =new SimpleDateFormat("yyyyMMdd"); } } /** * 上传图片 上传文件 * * @param context application上下文对象 * @param ossUpCallback 成功的回调 * @param img_name 上传到oss后的文件名称,图片要记得带后缀 如:.jpg * @param imgPath 图片的本地路径 */ public void upImage(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String img_name, String imgPath) { getOSs(context); final Date data =new Date(); data.setTime(System.currentTimeMillis()); PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+ img_name, imgPath); putObjectRequest.setProgressCallback(new OSSProgressCallback() { @Override public void onProgress(PutObjectRequest request,long currentSize,long totalSize) { ossUpCallback.inProgress(currentSize, totalSize); } }); oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.e("MyOSSUtils","------getRequestId:" + result.getRequestId()); // try { ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+img_name)); // } catch (ClientException e) { // e.printStackTrace(); // } } @Override public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) { ossUpCallback.successImg(null); } }); } /** * 上传图片 上传流 * * @param context application上下文对象 * @param ossUpCallback 成功的回调 * @param img_name 上传到oss后的文件名称,图片要记得带后缀 如:.jpg * @param imgbyte 图片的byte数组 */ public void upImage(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String img_name,byte[] imgbyte) { getOSs(context); final Date data =new Date(); data.setTime(System.currentTimeMillis()); PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+ img_name, imgbyte); putObjectRequest.setProgressCallback(new OSSProgressCallback() { @Override public void onProgress(PutObjectRequest request,long currentSize,long totalSize) { ossUpCallback.inProgress(currentSize, totalSize); } }); oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.e("MyOSSUtils","------getRequestId:" + result.getRequestId()); ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+img_name)); } @Override public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) { ossUpCallback.successImg(null); } }); } /** * 上传视频 * * @param context application上下文对象 * @param ossUpCallback 成功的回调 * @param video_name 上传到oss后的文件名称,视频要记得带后缀 如:.mp4 * @param video_path 视频的本地路径 */ public void upVideo(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String video_name, String video_path) { getOSs(context); final Date data =new Date(); data.setTime(System.currentTimeMillis()); PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+ video_name, video_path); putObjectRequest.setProgressCallback(new OSSProgressCallback() { @Override public void onProgress(PutObjectRequest request,long currentSize,long totalSize) { ossUpCallback.inProgress(currentSize, totalSize); } }); oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { ossUpCallback.successVideo(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+video_name)); } @Override public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) { ossUpCallback.successVideo(null); } }); } public interface OssUpCallback { void successImg(String img_url); void successVideo(String video_url); void inProgress(long progress,long zong); } }
现在你们看到的结果是完美的,可是不知它的过程有多么痛苦;接下来阐述几个坑:
1、传音视频和图片的时候,文件名称结尾一定要加上.mp4、.jpg、.png等后缀,直接拿本地的路径虽然有后缀,但是OSS那边是另一套名字。
2、当服务端要求存到某一个文件夹中的时候,一定是"文件夹名字 / 文件名" 开始和结尾一定一定不要带 "/"。
3、OSS官方没有给出文件批量上传的方法,OSS官方没有给出文件批量上传的方法,OSS官方没有给出文件批量上传的方法。重要的事情要说三遍。
4、OSS官方相关的安卓文档貌似并没有提到怎么拿到文件的url,但是工具类中已经有写到了:
oss.presignPublicObjectURL(P_BUCKETNAME, simpleDateFormat.format(data)+"/"+ img_name);//BUCKETNAME名字和文件名字。一定要在异步上传完成之后调用。
这里我没有做一个eg,因为其实官网的文档写的还是不错的,我觉得你要了解一个SDK一定要先看看API,然后才看工具类。这样你会特别明了。
有什么不好的地方可以提出,谢谢。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android微信授权登录内存泄漏问题
最近有个APP中使用了微信授权登录功能,项目中我们采用leakcanary来检测内存泄漏,发现微信登录有内存泄漏的问题。现将解决过程记录如下,不确定与微信SDK版本有没关系,欢迎讨论指正。 一般我们是这样使用微信登录的,包括微信给出的demo也是如此,代码片段如下: private IWXAPI mIWXAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIWXAPI = WXAPIFactory.createWXAPI(this, WX_APP_ID); mIWXAPI.registerApp(WX_APP_ID); findViewById(R.id.btn_wx_login).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) ...
- 下一篇
Android Recyclerview 实现画廊功能
你有你的各种需(借)求(鉴),我有我的各种措施,不是很强,但是很酷! 安排~(听说这句话最近很火) 最近啊,公司有个需求,想实现一个画廊效果,我找了两个App去给他看,问他是要类似于viewpager的有翻页的效果,还是想要跟列表似的,手滑动到哪里就停留在哪里。 然后产品回复我说:就跟它的一样(某个app),按照他的做就行,我的心里有些波澜,甚至想****;好了不说了。写效果吧。 gif.gif 不知道为什么是反着的,啊,凑合看吧。就是这种卡片轮播。 其他的不说了,直接上代码。 //recyclerview滑动监听 hignHeadRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int childCount = recyclerView.getChildCount();...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范