Android阿里云OSS鉴权模式(STS)上传图片文件

这篇讲述下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

猜你喜欢

转载自blog.csdn.net/lovelixue/article/details/88546142