前言:在做聊天APP的时候,需要涉及到图片消息的上传存储,传统方式会将图片存储在服务器上,但是这样做的话会给服务器造成较大的压力。很幸运,阿里云为我们提供了海量、安全、低成本、高可靠的云存储服务—OSS。

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管理。OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。

    如何使用对象存储OSS呢?首先需要创建用来存储文件的存储空间,操作步骤可自行到阿里云阅览。与刚刚提到的聊天APP相关的技术是OSS直传技术,假定已经开通了服务并创建了所需要的AccessKeyId与AccessKeySecret,接下开我们一起开始安卓端demo的编写:

   第一步,环境配置

   提供了两种配置方法,一种是直接导入相关的jar包(自行到阿里云下载),另外一种则是利用Gradle插件依赖Maven进行配置,在build.gradle文件中加入如下代码:

1. dependencies {
2. compile'com.aliyun.dpa:oss-android-sdk:+'
3. compile'com.squareup.okhttp3:okhttp:3.4.1'
4. compile'com.squareup.okio:okio:1.9.0'
5. }

   第二步,初始化

   阿里云针对安卓直传提供了一个OSSClient的概念,它是OSS服务的Android客户端,为使用者提供了一系列的方法可用来操作文件和存储空间,初始化部分代码如下:

public OssService initOSS(String endpoint, String bucket) {
   OSSCredentialProvider credentialProvider;
   //使用自己的获取STSToken的类
   credentialProvider = new OSSAuthCredentialsProvider(Config.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 oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
   OSSLog.enableLog();
   return new OssService(oss, bucket);

}



    上述代码中需要涉及两个概念EndPoint地址和bucket,其中EndPoint是区域地址,而bucket则是存储空间的名字

    第三步,上传文件

    图片消息弹出框提示,支持图库选择与拍照上传,获得图片的路径,并通过OSS提供的方法进行图片的上传,上传代码如下:

public void asyncPutImage(String object, String localFile, final Handler handler) {
    final long upload_start = System.currentTimeMillis();

    if (object.equals("")) {
        Log.w("AsyncPutImage", "ObjectNull");
        return;
    }

    File file = new File(localFile);
    if (!file.exists()) {
        Log.w("AsyncPutImage", "FileNotExist");
        Log.w("LocalFile", localFile);
        return;
    }


    // 构造上传请求
    PutObjectRequest put = new PutObjectRequest(mBucket, object, localFile);
    put.setCRC64(OSSRequest.CRC64Config.YES);
    // 异步上传时可以设置进度回调
    put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
        @Override
        public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
            Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
            int progress = (int) (100 * currentSize / totalSize);
        }
    });

    OSSAsyncTask task = mOss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
        @Override
        public void onSuccess(PutObjectRequest request, PutObjectResult result) {
            Log.d("PutObject", "UploadSuccess");

            Log.d("ETag", result.getETag());
            Log.d("RequestId", result.getRequestId());

            long upload_end = System.currentTimeMillis();
            handler.sendEmptyMessage(110);
        }

        @Override
        public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
            String info = "";
            // 请求异常
            if (clientExcepion != null) {
                // 本地异常如网络异常等
                clientExcepion.printStackTrace();
                info = clientExcepion.toString();
            }
            if (serviceException != null) {
                // 服务异常
                Log.e("ErrorCode", serviceException.getErrorCode());
                Log.e("RequestId", serviceException.getRequestId());
                Log.e("HostId", serviceException.getHostId());
                Log.e("RawMessage", serviceException.getRawMessage());
                info = serviceException.toString();
                handler.sendEmptyMessage(119);
            }
        }
    });
}
最后一步,测试

           运行APP(前提是STS服务开启),上传图片成功后登录阿里云控制台相应的存储空间下查看图片是否上传成功。

           PS:上面提到一个STSServer,再下一篇文章我们一起了解,谢谢观看