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,然后才看工具类。这样你会特别明了。

有什么不好的地方可以提出,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,076评论 3 119
  • 刚才的一瞬间我仿佛明白了很多,这些明白就像是郭敬明写下的人是一瞬间变老的一样。 看到班上几个同学她们在唱一首我不知...
    阿l四阅读 1,373评论 0 0
  • 拍摄这张照片之前三个半小时的时间里,老金和小祁正像新藏线上的修路工人一样,在海拔4000多米的无人区扬尘掘土的把我...
    孤魂玄子阅读 1,769评论 0 2
  • 期待在春天与你相遇,等候在夏天你一袭长裙。相遇和长裙都有了,一切是如此美好。 要经历多少事情,才可以把“我”变成“...
    慢半拍儿的闪电阅读 1,756评论 0 1
  • 儿子写日记 : 夜深了,妈妈在打麻将,爸爸在上网…… 爸爸检查时,很不满意地说 : 日记源于生活,但要...
    帅气的阿莉阅读 1,481评论 0 0

友情链接更多精彩内容