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());

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

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class GetAndUploadFileDemo { private static String TAG = "GetAndUploadFileDemo"; private OSSService ossService; private OSSBucket bucket; public void show() { ossService = OSSServiceProvider.getService(); bucket = ossService.getOssBucket("youcaidao"); // 文件的常规操作如普通上传、下载、拷贝、删除等,与Data类一致,故这里只给出断点下载和断点上传的demo resumableDownloadWithSpecConfig(); // delay(); // resumableUpload(); // delay(); // resumableDownload(); // delay(); } public void delay() { try { Thread.sleep(30 * 1000); } catch (Exception e) { e.printStackTrace(); } } // 断点上传 public void resumableUpload() { // OSSData ossData = ossService.getOssData(sampleBucket, "sample-data"); // ossData.setData(data, "raw"); // 指定需要上传的数据和它的类型 // ossData.enableUploadCheckMd5sum(); // 开启上传MD5校验 // ossData.upload(); // 上传失败将会抛出异常 OSSFile bigfFile = ossService.getOssFile(bucket, "de.jpg"); try { bigfFile.setUploadFilePath( "/storage/emulated/0/Android/data/com.qd.videorecorder/video/VMS_1439866564822.jpg", "image/jpg"); bigfFile.ResumableUploadInBackground(new SaveCallback() { @Override public void onSuccess(String objectKey) { Log.d(TAG, "[onSuccess] - " + objectKey + " upload success!"); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { Log.d(TAG, "[onProgress] - current upload " + objectKey + " bytes: " + byteCount + " in total: " + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { Log.e(TAG, "[onFailure] - upload " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); ossException.getException().printStackTrace(); } }); } catch (FileNotFoundException e) { e.printStackTrace(); } } // 断点下载 public void resumableDownload() { OSSFile bigFile = ossService.getOssFile(bucket, "bigFile.dat"); bigFile.ResumableDownloadToInBackground( "/storage/sdcard0/src_file/bigFile.dat", new GetFileCallback() { @Override public void onSuccess(String objectKey, String filePath) { Log.d(TAG, "[onSuccess] - " + objectKey + " storage path: " + filePath); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { Log.d(TAG, "[onProgress] - current download: " + objectKey + " bytes:" + byteCount + " in total:" + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { Log.e(TAG, "[onFailure] - download " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); } }); } // 设置相关参数的断点续传 public void resumableDownloadWithSpecConfig() { OSSFile bigFile = ossService .getOssFile(bucket, "VMS_1439866564822.jpg"); ResumableTaskOption option = new ResumableTaskOption(); option.setAutoRetryTime(2); // 默认为2次,最大3次 option.setThreadNum(2); // 默认并发3个线程,最大5个 bigFile.ResumableDownloadToInBackground( "/storage/emulated/0/Android/data/com.qd.videorecorder/video/VMS_1439866564822.jpg", new GetFileCallback() { // /storage/emulated/0/DCIM/Camera/VID_20150803_173350.mp4 @Override public void onSuccess(String objectKey, String filePath) { System.out.println("[onSuccess] - " + objectKey + " storage path: " + filePath); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { System.out.println("[onProgress] - current download: " + objectKey + " bytes:" + byteCount + " in total:" + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { System.out.println("[onFailure] - download " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); } }); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值