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.********这里权限就不贴代码了,什么网络权限,文件读取权限记得不要少。***********
https://www.alibabacloud.com/help/zh/doc-detail/94213.htm?spm=a2c63.p38356.b99.517.7b9c28068mfBsx 官方链接
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 图片的本地路径
*/
val conf = ClientConfiguration()
//ClientConfiguration 链接和socket 已经改为60s了
// conf.setConnectionTimeout(60 * 1000); // 连接超时,默认15秒
// conf.setSocketTimeout(60 * 1000); // socket超时,默认15秒
// conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
// conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
conf.isHttpDnsEnable = false
OSSLog.enableLog()
oss = com.alibaba.sdk.android.oss.OSSClient(getContext(), baseBean.data.host, OSSPlainTextAKSKCredentialProvider(baseBean.data.accessid, baseBean.data.accessKeySecret), conf)
val put = PutObjectRequest(baseBean.data.bucket, baseBean.data.policy, path)
// val putResult = oss!! .putObject(put)
// LogUtil.e("putResult", putResult.eTag)
//
// LogUtil.e("putResult", putResult.serverCallbackReturnBody.toString())
// // 设置进度回调函数打印进度条。
// 构造上传请求。
// 设置进度回调函数打印进度条。
put.progressCallback = OSSProgressCallback { request, currentSize, totalSize ->
Log.d("PutObject", "currentSize: $currentSize totalSize: $totalSize")
}
// 异步上传。
oss!!.asyncPutObject(put, object : OSSCompletedCallback {
override fun onSuccess(request: PutObjectRequest, result: PutObjectResult) {
Log.d("PutObject", "UploadSuccess")
Log.d("ETag", result.eTag)
Log.d("RequestId", result.requestId)
}
override fun onFailure(request: PutObjectRequest, clientExcepion: ClientException?, serviceException: ServiceException?) {
// 请求异常。
clientExcepion?.printStackTrace()
if (serviceException != null) {
// 服务异常。
Log.e("ErrorCode", serviceException.errorCode)
Log.e("RequestId", serviceException.requestId)
Log.e("HostId", serviceException.hostId)
Log.e("RawMessage", serviceException.rawMessage)
}
}
})
/**
* 上传图片 上传流
*
* @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,但是工具类中已经有写到了:
5,最重要的一个坑,
bucketName一定要自己写进去,不要拼到host里
oss.presignPublicObjectURL(P_BUCKETNAME, simpleDateFormat.format(data)+"/"+ img_name);