这篇讲述下Android通过阿里云OSS上传文件,使用鉴权模式,废话不多说,直接上步骤
1.添加所需依赖
implementation 'com.aliyun.dpa:oss-android-sdk:+'
implementation "com.squareup.okhttp3:okhttp:3.9.0"
2.添加权限
<uses-permission android:name=
"android.permission.INTERNET"
/>
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
/>
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission android:name=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
3.初始化OSS
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken) {
@Override
public OSSFederationToken getFederationToken() {
//可实现自动获取token
return super.getFederationToken();
}
};
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
OSSLog.enableLog();
oss = new OSSClient(context, endpoint, credentialProvider, conf);
accessKeyId, accessKeySecret, securityToken这三个值是从后台获取的,尤其要注意这个值的正确性,如果报错accessKeyId无效,那么一定是后台这些值有问题,找后台即可
4.开始异步上传
public void asyncUpLoad(final String objectKey, String uploadFilePath, final OnAsyncUpLoadListener onAsyncUpLoadListener) {
if (!TextUtils.isEmpty(objectKey) && !TextUtils.isEmpty(uploadFilePath) && oss != null) {
// 构造上传请求
PutObjectRequest put = new PutObjectRequest(bucket, objectKey, uploadFilePath);
// 异步上传时可以设置进度回调
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
if (onAsyncUpLoadListener != null) {
onAsyncUpLoadListener.onProgress(request, currentSize, totalSize);
}
Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
if (onAsyncUpLoadListener != null) {
String directory = endpoint.replace("oss-cn", bucket + ".oss-cn") + "/";
onAsyncUpLoadListener.onSuccess(request, result, directory);
}
// loadDialog.dismiss();
Log.d("PutObject", "UploadSuccess");
Log.d("ETag", result.getETag());
Log.d("RequestId", result.getRequestId());
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
if (onAsyncUpLoadListener != null) {
onAsyncUpLoadListener.onFailure(request, clientExcepion, serviceException);
}
// loadDialog.dismiss();
// 请求异常
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());
}
}
});
}
}
字段解释:
accessKeyId:后台返回的ak,需要在有效期内
accessKeySecret:后台返回的sk,和ak一暗影,这两个极为重要和危险,安全性相关
securityToken:安全性验证的token
endpoint:域名,一般为"oss-cn-shenzhen.aliyuncs.com",看你们服务器地址,是杭州就把shenz改成hangzhou
bucketname:存储空间,只你上传到哪个空间里面去(命名规则可查看相关文档)
objectKey:上传后的文件名
uploadFilePath:本地文件(需要上传的文件)路径
好了,基本流程就这些,也不复杂
阿里云Android上传官方文档
https://help.aliyun.com/document_detail/32042.html?spm=a2c4g.11186623.6.941.2abe1ea8gAYXg6
阿里云OSS错误信息文档
https://help.aliyun.com/document_detail/32005.html?spm=a2c4g.11186623.6.1388.715a4de3cnnd3V