当前位置:首页 > 移动端 > Android阿里OSS下载与上传

Android阿里OSS下载与上传

2022年08月04日 23:11:32移动端14

OSS资料可以去阿里官方https://help.aliyun.com/product/31815.html?spm=5176.7933691.744462.c2.730d6a56i4JuC5查看,很全面,也很详细;

OSS集成Android Studio中

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

1、OSS下载

根据提供url进行下载,其实也可以用其他的网络请求框架进行下载,比如:OKHttp,Volley等等,不过OSS内部就是以OkHttp封装的,所以我们还是用下他自带的下载方法

不管是下载还是上传都要设置OSS的OSS_ENDPOINT、BUCKET_NAME、还有通过STS_SERVER_URL这个地址获取OSS的Token授权密钥,这点很重要,

1)、通过STS_SERVER_URL来获取OSSCredentialProvider,创建OSS时需要用来判断是不是密钥过期,这里需要自定义来获取该对象

public class MyOSSAuthCredentialsProvider extends OSSFederationCredentialProvider {


    private String mAuthServerUrl;
    private AuthDecoder mDecoder;

    public MyOSSAuthCredentialsProvider(String authServerUrl) {
        this.mAuthServerUrl = authServerUrl;
    }

    /**
     * set auth server url
     *
     * @param authServerUrl
     */
    public void setAuthServerUrl(String authServerUrl) {
        this.mAuthServerUrl = authServerUrl;
    }

    /**
     * set response data decoder
     *
     * @param decoder
     */
    public void setDecoder(AuthDecoder decoder) {
        this.mDecoder = decoder;
    }

    @Override
    public OSSFederationToken getFederationToken() throws ClientException {
        OSSFederationToken authToken = null;
        String authData;
        try {
            URL stsUrl = new URL(mAuthServerUrl);
            HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
            conn.setConnectTimeout(10000);
            InputStream input = conn.getInputStream();
            authData = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
            if (mDecoder != null) {
                authData = mDecoder.decode(authData);
            }
//            Log.e("zzz", "MyOSSAuthCredentialsProvider--getFederationToken--authData--" + authData);
            JSONObject jsonObject = new JSONObject(authData);
            String msg = jsonObject.getString("Msg");
            return authToken;
        } catch (Exception e) {
            throw new ClientException(e);
        }
    }

    public interface AuthDecoder {
        String decode(String data);
    }
}

 

需要在getFederationToken这个方法里面就行创建authToken,这是最重要的一步,因为如果token有期效,过期会重新获取,每个公司的加密方法不一样,这里我就不多说了,获取authToken中有一部分解密的代码被我去掉了

2)、初始化OSS 

OSSCredentialProvider credentialProvider = new MyOSSAuthCredentialsProvider(Config.STS_SERVER_URL);
        //该配置类如果不设置,会有默认配置,具体可看该类
        ClientConfiguration conf = new ClientConfiguration();
        // 连接超时,默认15秒
        conf.setConnectionTimeout(15 * 1000);
        // socket超时,默认15秒
        conf.setSocketTimeout(15 * 1000);
        // 最大并发请求数,默认5个
        conf.setMaxConcurrentRequest(5);
        // 失败后最大重试次数,默认2次
        conf.setMaxErrorRetry(2);
        oss = new OSSClient(context, Config.OSS_ENDPOINT, credentialProvider,conf);
        if (simpleDateFormat == null) {
            simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        }

3)、下载

public void download(String url, final String path){
        GetObjectRequest get = new GetObjectRequest(Config.BUCKET_NAME, url);
        //设置下载进度回调
        get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
            @Override
            public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
                OSSLog.logDebug("getobj_progress: " + currentSize+"  total_size: " + totalSize, false);
                Log.e("zzz","HelloMoonFragment--onProgress--currentSize" + currentSize + ",totalSize--" + totalSize);
            }
        });
        OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
            @Override
            public void onSuccess(GetObjectRequest request, GetObjectResult result) {
                Log.e("zzz","HelloMoonFragment--onSuccess--");
                // 请求成功
                InputStream is = null;
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream fos = null;
                try
                {
                    is = result.getObjectContent();
                    File file = new File(path);
                    if(!file.exists()){
                        file.createNewFile();
                    }
                    fos = new FileOutputStream(file);
                    while ((len = is.read(buf)) != -1){
                        fos.write(buf, 0, len);
                    }
                    fos.flush();
                }catch (IOException e){
                    e.printStackTrace();
                }finally {
                    if(is != null){
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if(fos != null){
                        try {
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

            @Override
            public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常
                if (clientExcepion != null) {
                    Log.e("zzz","HelloMoonFragment--ErrorCode--clientException" + clientExcepion.getMessage());
                    // 本地异常如网络异常等
                    clientExcepion.printStackTrace();
                }
                if (serviceException != null) {
                    // 服务异常
                    Log.e("zzz","HelloMoonFragment--ErrorCode--"+serviceException.getErrorCode());
                    Log.e("zzz","HelloMoonFragment--RequestId--"+serviceException.getRequestId());
                    Log.e("zzz","HelloMoonFragment--HostId--"+serviceException.getHostId());
                    Log.e("zzz","HelloMoonFragment--RawMessage--"+serviceException.getRawMessage());
                }
            }
        });
    }

注意:这个url不是我们获取的url,而是去掉OSS_ENDPOINT的那部分

2、上传图片

public void uploadImage(String uploadFilePath){
        //上传的objectKey
        final String objectKey = "";
        Log.e("zzz","uploadImage--uploadFilePath--1--" + uploadFilePath);
        File file = new File(uploadFilePath);
        if(!file.exists()){
            return;
        }
        Log.e("zzz","uploadImage--uploadFilePath--2--" + file.length());
        PutObjectRequest putObjectRequest = new PutObjectRequest(Config.BUCKET_NAME,objectKey,uploadFilePath);
        putObjectRequest.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                Log.e("zzz", "currentSize: " + currentSize + " totalSize: " + totalSize);
            }
        });
        oss.asyncPutObject(putObjectRequest, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                Log.e("zzz","uploadImage--onSuccess--1--");
                Log.e("zzz", "uploadImage--onSuccess--2--" + result.getETag());
                Log.e("zzz", "uploadImage--onSuccess--3--" + result.getRequestId());
                //根据上传的objectKey去获取下载该上传文件的url
                String uploadOssUrl = oss.presignPublicObjectURL(Config.BUCKET_NAME, objectKey);
                Log.e("zzz","uploadImage--onSuccess--4--" +  uploadOssUrl);
            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
                Log.e("zzz","uploadImage--onFailure");
                // 请求异常
                if (clientException != null) {
                    Log.e("zzz","uploadImage--clientException" + clientException.getMessage());
                    // 本地异常如网络异常等
                    clientException.printStackTrace();
                }
                if (serviceException != null) {
                    // 服务异常
                    Log.e("uploadImage--ErrorCode", serviceException.getErrorCode());
                    Log.e("uploadImage--RequestId", serviceException.getRequestId());
                    Log.e("uploadImage--HostId", serviceException.getHostId());
                    Log.e("uploadImage--RawMessage", serviceException.getRawMessage());
                }
            }
        });
    }

注意:objectKey里面的字符串被我去掉了,用你们自己要上传的路径

uploadFilePath要上传文件的路径,objectKey上传到OSS上的路径,根据上传的objectKey去获取下载该上传文件的url
String uploadOssUrl = oss.presignPublicObjectURL(Config.BUCKET_NAME, objectKey);

作者:隐形人007
来源链接:https://blog.csdn.net/hujiaxi222/article/details/85279815

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/mobile/17367.html

分享给朋友:

“Android阿里OSS下载与上传” 的相关文章

flutter项目如何打包(android)

flutter项目如何打包(android)

打包前要做的 1.更换图标 andriod–》app–app–》src—》main-》Java----》res–》minpmap 其实这个打包的坑还是比较多的,官方文档显然是站在大神级程序员的角度写的,所以如果你看文档,特别是前...

让Android Studio代码提示不区分大小写的方法

让Android Studio代码提示不区分大小写的方法

在as的使用过程中,智能提示会区分大小写,对我们快速开发十分不利,不断切换大小写很影响效率,这个时候不区分大小写的优势就出来了,如何设置,直接上图: 作者:大前端之旅 来源链接: https://jianguo.blog.csd...

使用 Amazon Amplify快速创建简单的 Android 应用程序

使用 Amazon Amplify快速创建简单的 Android 应用程序

背景: 亚马逊云科技提供了100余种产品免费套餐。其中,计算资源Amazon EC2首年12个月免费,750小时/月;存储资源 Amazon S3 首年12个月免费,5GB标准存储容量。 大家好,我是坚果,由于最近一直疫情居家,所以想到外边转转,但...

Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序(文末送书)

Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序。 作者:坚果 公众号:“大前端之旅” 华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体验官,开源项目GVA成员之一,专注于大前端...

Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框 作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。...

Java 异常基础 Exception

Java 异常基础 Exception

Java中的异常。包括异常的基本分类,处理异常的基本方法,自定义异常的方法和常见的一种有关异常的笔试面试题。 Java中的异常 Exception   java.lang.Exception类是Java中所有异常的直接或间接父类。即Exception类是所有异常...

分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面

分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面

此篇文章主要整理了最近在使用 Ionic 开发 Hybrid App 过程中遇到的一些疑难点以及后期发布生成 iOS 和 Android 版本过程中的种种问题。 文章目录 Ionic 简介和项目需求介绍 View 缓存的处理 键...

2.Java中Exception和Error的区别

2.Java中Exception和Error的区别

Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型 Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比...

Android打印堆栈

Android打印堆栈 java打印堆栈 方法一:...

解决ADT不显示javadoc An exception occurred while getting the javadoc

这几天发现ADT在网速特别差的情况下,鼠标悬停不会显示javadoc,而自己写的注释则没有问题. 在网络畅通的时候又会显示javadoc. 所以我猜测ADT会在本地查找文档失败时候尝试联网查找. 一般来说,如果你之前鼠标悬停会显示javadoc,最近突然不显示了...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。