Android关于阿里OSS图片上传的封装

公司的项目需要移动端使用OSS上传图片,对图片进行统一管理,减轻服务端的压力。所以我封装了一个OSS上传图片的工具类,这里做个记录,供自己和其他同仁使用。

首先我们先把库引进来

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

接着就是我们的工具类接口了

public interface IOssCallBack {
    public void progress(int progress);//进度回调接口
    public void success();//成功回调接口
    public void failure();//失败回调接口
}

下来是工具类了

public class OssUtils {

    private static OssUtils ossUtils;
    private static OSS oss;
    private static SharedPreferences sps;
    private static ClientConfiguration conf;
    private static OSSCredentialProvider credetialProvider;

    /**
     * 初始化oss对象,这个里面因为有网络请求,需要在我们使用的时候再进行初始化。
     */
    public static OssUtils getInstance(Context context) {
        if (ossUtils == null) {
            ossUtils = new OssUtils();
            //共享参数初始化
            sps = context.getSharedPreferences("clouddriver", Context.MODE_PRIVATE);
            //设置配置文件
            conf = new ClientConfiguration();
            conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
            conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
            conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个。
            conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
        }
        return ossUtils;
    }

    /**
     * 单图上传方法
     *
     * @param path
     * @param name
     * @param callBack
     */
    public void uploadPicByPath(Context context, String path, String name, IOssCallBack callBack) {
        if (ossUtils != null) {
            OkGo.get((String) Latte.init().getHash().get(ConfigType.OSS_KEY.name()))
                    .tag(this)
                    .headers("Content-Type", "application/json")
                    .headers("Authorization", "Bearer " + sps.getString("access_token", ""))
                    .params("key", "cloudStsToken")
                    .execute(new MyCallback() {
                        @Override
                        public void onSuccess(String s, Call call, Response response) {
                            OssEntity ossEntity = new Gson().fromJson(s, OssEntity.class);
                            String ak = ossEntity.getData().getAccessKeyId();
                            String sk = ossEntity.getData().getAccessKeySecret();
                            String token = ossEntity.getData().getSecurityToken();
                            String expiration = ossEntity.getData().getExpiration();
                            credetialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
                            // 配置类如果不设置,会有默认配置。
                            oss = new OSSClient(context, "oss-cn-beijing.aliyuncs.com", credetialProvider, conf);
                            //开始上传工作
                            PutObjectRequest put = new PutObjectRequest("clouds1000", name, path);
                            // 异步上传时可以设置进度回调。
                            put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
                                @Override
                                public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                                    callBack.progress((int) (((double) currentSize / (double) totalSize) * 100));
                                }
                            });
                            OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
                                @Override
                                public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                                    callBack.success();
                                }

                                @Override
                                public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                                    callBack.failure();
                                }
                            });
                        }

                        @Override
                        public void MyOnError(Call call, Response response, Exception e, String errorMsg) {
                            ToastUtil.showViewToast(context, "请检查您的网络");
                        }
                    });
        }
    }

    /**
     * OSS多图上传
     * @param context
     * @param pathList
     */
    public void multiUploadPicByPath(Context context,List<PicUpLoadBean> pathList){
        if (ossUtils != null) {
            OkGo.get((String) Latte.init().getHash().get(ConfigType.OSS_KEY.name()))
                    .tag(this)
                    .headers("Content-Type", "application/json")
                    .headers("Authorization", "Bearer " + sps.getString("access_token", ""))
                    .params("key", "cloudStsToken")
                    .execute(new MyCallback() {
                        @Override
                        public void onSuccess(String s, Call call, Response response) {
                            OssEntity ossEntity = new Gson().fromJson(s, OssEntity.class);
                            String ak = ossEntity.getData().getAccessKeyId();
                            String sk = ossEntity.getData().getAccessKeySecret();
                            String token = ossEntity.getData().getSecurityToken();
                            String expiration = ossEntity.getData().getExpiration();
                            credetialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
                            // 配置类如果不设置,会有默认配置。
                            oss = new OSSClient(context, "oss-cn-beijing.aliyuncs.com", credetialProvider, conf);
                            //这里开始进行一个循环
                            for (int i=0;i<pathList.size();i++) {
                                IOssCallBack callBack = pathList.get(i).getCallBack();
                                String name = pathList.get(i).getPicName();
                                String path = pathList.get(i).getPicPath();
                                //开始上传工作
                                PutObjectRequest put = new PutObjectRequest("clouds1000", name, path);
                                // 异步上传时可以设置进度回调。
                                put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
                                    @Override
                                    public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                                        callBack.progress((int) (((double) currentSize / (double) totalSize) * 100));
                                    }
                                });
                                OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
                                    @Override
                                    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                                        callBack.success();
                                    }

                                    @Override
                                    public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                                        callBack.failure();
                                    }
                                });
                            }
                        }

                        @Override
                        public void MyOnError(Call call, Response response, Exception e, String errorMsg) {
                            ToastUtil.showViewToast(context, "请检查您的网络");
                        }
                    });
        }
    }
}

实体类PicUpLoadBean

public class PicUpLoadBean {
    private String picName;
    private String picPath;
    private int picProgress;
    private IOssCallBack callBack;

    public String getPicName() {
        return picName;
    }

    public void setPicName(String picName) {
        this.picName = picName;
    }

    public String getPicPath() {
        return picPath;
    }

    public void setPicPath(String picPath) {
        this.picPath = picPath;
    }

    public int getPicProgress() {
        return picProgress;
    }

    public void setPicProgress(int picProgress) {
        this.picProgress = picProgress;
    }

    public IOssCallBack getCallBack() {
        return callBack;
    }

    public void setCallBack(IOssCallBack callBack) {
        this.callBack = callBack;
    }
}

单图上传调用

String objectName = "android" + sps.getInt("user_id", 0) + System.currentTimeMillis();
dialogWeb.show();
OssUtils.getInstance(this).uploadPicByPath(this,UriToPathUtil.getRealFilePath(this, resultUri), objectName, new IOssCallBack() {
    @Override
    public void progress(int progress) {
        Log.i("myoss", progress + "");
    }

    @Override
    public void success() {
        dialogWeb.dismiss();
        Log.i("myoss", "success");
    }

    @Override
    public void failure() {
        dialogWeb.dismiss();
        Log.i("myoss", "failure");
    }
});

多图上传调用

OssUtils.getInstance(this).multiUploadPicByPath(this,picList);

这个list的每一个对象对应一个图片,其中包含了图片的ObjectName,路径,上传进度和对应的接口回调,用的时候直接拿出来用就可以了,多张图片不会发生冲突。OSS默认多线程上传。需要注意的一点,这个回调是子线程,如果要更新UI需要配合Handler进行使用。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
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(); } }); } }
你可以使用阿里云官方提供的 OSS(对象存储服务)SDK 来实现 Android 上的文件上传功能。以下是一个简单的示例代码,需要先引入阿里云 OSS SDK 的依赖: ```java implementation 'com.aliyun.dpa:oss-android-sdk:3.1.8' ``` 然后,在你的代码中使用以下方法来实现文件上传: ```java import com.aliyun.dpa.oss.app.AppServiceFactory; import com.aliyun.dpa.oss.app.OSSClientFactory; import com.aliyun.dpa.oss.app.RunningConfig; import com.aliyun.dpa.oss.app.ServiceFactory; import com.aliyun.dpa.oss.app.UploadConfiguration; import com.aliyun.dpa.oss.app.UploadConfigurationFactory; import com.aliyun.dpa.oss.app.UploadManager; import com.aliyun.dpa.oss.app.util.FileUtil; import com.aliyun.dpa.oss.app.util.StringUtil; import com.aliyun.dpa.oss.app.util.UIUtil; import com.aliyun.dpa.oss.callback.ResultCallback; import com.aliyun.dpa.oss.model.OSSUploadConfiguration; import com.aliyun.dpa.oss.task.PutObjectTask; import com.aliyun.dpa.oss.task.TaskCancelledException; public class AliOSSUploader { private static final String ENDPOINT = "your_oss_endpoint"; // 你的 OSS Endpoint private static final String ACCESS_KEY_ID = "your_access_key_id"; // 你的 Access Key ID private static final String ACCESS_KEY_SECRET = "your_access_key_secret"; // 你的 Access Key Secret private static final String BUCKET_NAME = "your_bucket_name"; // 你的 Bucket 名称 public void uploadFile(String filePath) { // 创建 OSS 客户端 RunningConfig runningConfig = new RunningConfig(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ENDPOINT); AppServiceFactory.init(runningConfig); ServiceFactory serviceFactory = OSSClientFactory.createServiceFactory(); UploadConfiguration configuration = UploadConfigurationFactory.getUploadConfiguration(); UploadManager uploadManager = serviceFactory.createUploadManager(configuration); // 构造上传任务 PutObjectTask putObjectTask = new PutObjectTask(BUCKET_NAME, StringUtil.generateRandomKey(), filePath); // 设置上传结果回调 putObjectTask.setResultCallback(new ResultCallback() { @Override public void onSuccess(Object object) { // 文件上传成功 UIUtil.showToast("文件上传成功"); } @Override public void onFailure(Exception e) { // 文件上传失败 UIUtil.showToast("文件上传失败:" + e.getMessage()); } @Override public void onProgress(Object object, long currentSize, long totalSize) { // 文件上传进度 int progress = (int) (currentSize * 100 / totalSize); UIUtil.showToast("文件上传进度:" + progress + "%"); } @Override public void onCancel(Object object) { // 文件上传取消 UIUtil.showToast("文件上传取消"); } }); // 开始上传任务 try { uploadManager.upload(putObjectTask); } catch (TaskCancelledException e) { // 上传任务取消 UIUtil.showToast("文件上传取消"); } } } ``` 以上代码中的 `your_oss_endpoint`、`your_access_key_id`、`your_access_key_secret` 和 `your_bucket_name` 分别是你的 OSS Endpoint、Access Key ID、Access Key Secret 和 Bucket 名称。你需要将它们替换为你自己的实际值。 调用 `uploadFile` 方法并传入要上传的文件路径,即可实现文件上传到阿里云 OSS。记得在 AndroidManifest.xml 中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 希望对你有帮助!如有其他问题,请随时提问。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值