Android 快速集成阿里云OSS服务2020

一、兼单快速集成

1、打开阿里云官网 https://www.aliyun.com并注册账号,然后登陆

2、在阿里云主页选择产品分类,再选择对象存储OSS

 3、点击帮助文档开始进行集成

   (1)、点击帮助文档进入开发文档界面

(2)在文档目录——>SDK参考——>Android——>安装,这里有几种方式,本人建议最快速简便的方式在app下的build.gradle文件加入依赖,再进行编译就OK了,友情提示:不要忘记加入必要权限和混淆设置哦!

二、初始化配置

    1、在配置参数之前最好了解下OSS服务中的基本概念 操作:开发指南——>基本概念

   2、创建储存空间  一般这个步骤是由后台来配置,然后会将各种参数给前端(这样的话接下来的第三步就可以照抄了)

(1)打开OSS服务控制台

(2)选择存储空间列表 创建Bucket,配置各类属性

  3、配置必要参数   快速入门

            (1)、这里最主要的是配置区域地址、空间名字以及OSS服务的app_key和app_secret

(2)文件上传下载处理类  由于我的项目中没有用到STS鉴权模式,用到的是最简便的方式,如有用到鉴权模式的同学,可以参考文档进行集成。这个处理类本人对于单文件上传用的是同步上传的方式,多文件上传用的是异步上传。

public class AliyunOSSUtils {

    private static AliyunOSSUtils mOSSUtils;
    private UploadListener listener;
    private static OSS oss;

    /**
     * 单一实例
     */
    public static AliyunOSSUtils getInstance() {

        if (mOSSUtils == null) {
            synchronized (AliyunOSSUtils.class) {
                if (mOSSUtils == null) {
                    mOSSUtils = new AliyunOSSUtils();
                }

            }
        }
        return mOSSUtils;
    }

    public AliyunOSSUtils() {
// 配置类如果不设置,会有默认配置。
        OSSPlainTextAKSKCredentialProvider provider = new OSSPlainTextAKSKCredentialProvider(MyOSSConfig.OSS_ACCESS_KEY_ID, MyOSSConfig.OSS_ACCESS_KEY_SECRET);
        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(MyApplication.getInstance(), MyOSSConfig.OSS_EXTERNAL_ENDPOINT, provider, conf);
    }

    /**
     * 上传单个文件
     *
     * @param name
     * @param localPath
     */

    public String uploadFile(String name, String localPath) {
        // 构造上传请求。
        PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, name, localPath);
        // 异步上传时可以设置进度回调。
        put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                L.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);

            }
        });

        try {
            // 开始同步上传
            PutObjectResult result = oss.putObject(put);

            L.d("upload: result=" + result);
            // 得到一个外网可访问的地址
            String url = oss.presignPublicObjectURL(BUCKET_NAME, name);
//            if (listener != null)
//                listener.onUpLoadComplete(url);
            // 格式打印输出
            L.e("--------------同步上传:" + url + "-----------");
            L.d(String.format("PublicObjectURL:%s", url));
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //上传多个文件
    public void upLoadMultipleFile(String name, String path) {
        // 构造上传请求。
        PutObjectRequest put = new PutObjectRequest(BUCKET_NAME, name, path);

        // 异步上传时可以设置进度回调。
        put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                L.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
            }
        });

        OSSAsyncTask task = oss.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());
                String url = oss.presignPublicObjectURL(BUCKET_NAME, name);

                L.e("图片地址--------------" + url + "-----------------");
                if (listener != null)
                    listener.onUpLoadComplete(url);
            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常。
                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());
                }
            }
        });

        // task.cancel(); // 可以取消任务。
        // task.waitUntilFinished(); // 等待上传完成。

    }


    public void setUpLoadListener(UploadListener listener) {
        this.listener = listener;
    }
    
    /**
     * 下载文件
     *
     * @param name
     */


    public void downLoadFile(String name) {
        // 构造下载文件请求。
        GetObjectRequest get = new GetObjectRequest(BUCKET_NAME, name);
        OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
            @Override
            public void onSuccess(GetObjectRequest request, GetObjectResult result) {
                // 请求成功。
                Log.d("asyncGetObject", "DownloadSuccess");
                Log.d("Content-Length", "" + result.getContentLength());

                InputStream inputStream = result.getObjectContent();
                byte[] buffer = new byte[2048];
                int len;

                try {
                    while ((len = inputStream.read(buffer)) != -1) {
                        // 您可以在此处编写代码来处理下载的数据。

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            // GetObject请求成功,将返回GetObjectResult,其持有一个输入流的实例。返回的输入流,请自行处理。
            public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常。
                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());
                }
            }
        });
        // task.cancel(); // 可以取消任务。
        // task.waitUntilFinished(); // 等待任务完成。
    }


    public interface UploadListener {

        void onUpLoadComplete(String url);

    }

}

三、具体用法

    1、初始化

   AliyunOSSUtils ossUtils = AliyunOSSUtils.getInstance();

    2、设置上传回调

ossUtils.setUpLoadListener(new AliyunOSSUtils.UploadListener() {
    @Override
    public void onUpLoadComplete(String url) {

        data.put("images[" + upLoadNum + "]", url);
        upLoadNum++;

        L.e("图片地址2-----" + url + "---------------------");

        if (upLoadNum < fileList.size()) {
            L.e("上传数量----" + upLoadNum + "-------------");
            submit2aliyun(fileList.get(upLoadNum));
        } else {

      //这里处理所有文件上传成功后的逻辑

        }

    }
});

3、文件上传

int upLoadNum;
Map<String, String> data = new HashMap<>();

//提交
private void commit() {

    if (mList.size() < 1) {
        showToast("请添加照片");
        return;
    }
    upLoadNum = 0;
    data.clear();

    //上传至阿里云

    submit2aliyun(fileList.get(upLoadNum));

}

4、这里submit2aliyun()方法用到雪花算法,这里我就不讲解了,如果需要的可以自行去了解,不需要的直接调用多文件上传的方法就OK了!

//上传至阿里云
private void submit2aliyun(File file) {

    String name = file.getName();

    SnowFlakeWorkId snowId = new SnowFlakeWorkId();

    String key = snowId.nextId() + name.substring(name.indexOf("."));

    ossUtils.upLoadMultipleFile("gallery/" + key, file.getAbsolutePath());

}
到此就告一段落了。本人新手,第一次写博客,如有错误的地方,还望大家多多指正。如能帮到大家我很欣慰。

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页