对象存储OSS

阿里云

Posted by LXG on March 18, 2020

对象存储OSS

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

图片和音视频等应用的海量存储

OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。

object_oss

Android SDK

aliyun-oss-android-sdk


dependencies {

    implementation 'com.aliyun.dpa:oss-android-sdk:2.9.3'

}

初始化

OSSClient 是 OSS 服务的 Android 客户端,它为调用者提供了一系列的方法进行操作、管理存储空间(Bucket)和文件(Object)等。 在使用 SDK 发起对 OSS 的请求前,您需要初始化一个 OSSClient 实例,并对它进行一些必要设置。


        OSSAuthCredentialsProvider authCredentialsProvider = new OSSAuthCredentialsProvider(STS_INFO_URL);

        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000);        // 连接超时,默认15秒。
        conf.setSocketTimeout(15 * 1000);            // socket超时,默认15秒。
        conf.setMaxConcurrentRequest(5);             // 最大并发请求数,默认5个。
        conf.setMaxErrorRetry(2);                    // 失败后最大重试次数,默认2次。

        mClient = new OSSClient(MyApplication.getInstance(), OSS_ENDPOINT, authCredentialsProvider, conf);

        OSSLog.enableLog();

Endpoint

Endpoint 是阿里云 OSS 服务在各个区域的地址

STS鉴权模式

移动终端是一个不受信任的环境,把AccessKeyId和AccessKeySecret直接保存在终端用来加签请求,存在极高的风险。 如果使用STS鉴权模式,推荐使用OSSAuthCredentialsProvider方式直接访问鉴权应用服务器,token过期后可以自动更新。

存储空间

存储空间(Bucket)是存储对象(Object)的容器。对象都隶属于存储空间

文件操作

  1. 上传文件
  2. 下载文件
  3. 管理文件

示例代码


public class OSSWrapper {

    private static final String TAG = "OSSWrapper";

    private static final OSSWrapper WRAPPER = new OSSWrapper();
    private OSSClient mClient;

    // Endpoint 是阿里云 OSS 服务在各个区域的地址
    private static final String OSS_ENDPOINT = "http://oss-cn-hangzhou.aliyuncs.com";


    private static final String BUCKET_NAME = BUILD_TYPE.equals("release") ? "release" : "test";


    private OSSWrapper() {
        Log.d(TAG, "OSSWrapper create start");
        OSSFederationCredentialProvider authCredentialsProvider = new OSSFederationCredentialProvider() {
            @Override
            public OSSFederationToken getFederationToken() {
                Log.d(TAG, "getFederationToken");
                return getOssFederationToken();
            }
        };

        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000);        // 连接超时,默认15秒。
        conf.setSocketTimeout(15 * 1000);            // socket超时,默认15秒。
        conf.setMaxConcurrentRequest(5);             // 最大并发请求数,默认5个。
        conf.setMaxErrorRetry(2);                    // 失败后最大重试次数,默认2次。

        mClient = new OSSClient(MyApplication.getInstance(), OSS_ENDPOINT, authCredentialsProvider, conf);

        OSSLog.enableLog();
        Log.d(TAG, "OSSWrapper create end");
    }

    private OSSFederationToken getOssFederationToken() {
        String jsonText = RequestUtils.getToken();
        Log.d(TAG, jsonText);
        try {
            JSONObject credentials = new JSONObject(jsonText);
            String ak = credentials.optString("AccessKeyId");
            String sk = credentials.optString("AccessKeySecret");
            String token = credentials.optString("SecurityToken");
            String expiration = credentials.optString("Expiration");
            return new OSSFederationToken(ak, sk, token, expiration);
        } catch (JSONException e) {
            Log.d(TAG, "getOssFederationToken: " + e);
        }
        return null;
    }

    public static OSSWrapper sharedWrapper() {
        return WRAPPER;
    }

    /**
     * 上传文件
     */
    public void asyncPutObject(String objectKey, String filePath, final OSSCallback callback) {
        final PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, objectKey, filePath);
        put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                Log.d(TAG, "currentSize: " + currentSize + " totalSize: " + totalSize);
            }
        });

        Log.d(TAG, "asyncPutObject start");
        mClient.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                Log.d(TAG, "asyncPutObject: Upload Success");
                Log.d(TAG, "ETag:" + result.getETag());
                Log.d(TAG, "RequestId: " + result.getRequestId());
                callback.onSuccess();
            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
                Log.d(TAG, "asyncPutObject: Upload Fail");
                if (clientException != null) {
                    clientException.printStackTrace();
                }
                if (serviceException != null) {
                    Log.e(TAG, "ErrorCode: " + serviceException.getErrorCode());
                    Log.e(TAG, "RequestId" + serviceException.getRequestId());
                    Log.e(TAG, "HostId: " + serviceException.getHostId());
                    Log.e(TAG, "RawMessage: " + serviceException.getRawMessage());
                }
            }
        });
    }

    public interface OSSCallback {
        void onSuccess();
    }

}