安卓Android阿里OSS上传图片(缩略图使用)三步完成+源码例子

2023-05-16

安卓Android阿里OSS上传图片(缩略图使用)三步完成+源码例子

博主在做这块阿里OSS上传,也是踩过不少相关的坑,并且阿里的官方文档也是不是很详细,也翻阅不少文章,感觉有所不足,所以记录本文,希望对后面采坑的读者有所帮助,本文目前只针对安卓端OOS开发,并且后台是做好了相关的工作(使用已经搭建好的应用服务器),那么请往下看

本文核心要点多文件的同步上传or异步上传,单文件上传博主没踩到什么坑,读者应该比博主的聪明

1,选择图片
2

2,上传阿里OSS
在这里插入图片描述

3,发布成功
在这里插入图片描述

一 添加阿里OSS需要依赖(步骤一)

添加完相关依赖,我们进入步骤二,开始

//阿里云OSS上传文件的SDK,上传内层依赖okhttp网络框架
    compile 'com.aliyun.dpa:oss-android-sdk:+'
    compile 'com.squareup.okhttp3:okhttp:3.11.0'
    compile 'com.squareup.okio:okio:1.9.0'

二 触发请求自家服务器索要授权

在触发上传的地方
1,发送自家网络请求,请求自家服务器索要授权
2, 成功返回拿到需要AccessKeyId、AccessKeySecret、SecurityToken、Expiration
3,获取这些信息后,调用阿里SDK,构建OssClient上传即可

P层的请求

  /**
     * 上传次数
     */
    int number;
    /**
     * 成功上传(本地文件名作为key,阿里云地址为value)
     */
    List<String> success = new ArrayList<>();
    /**
     * 失败上传(返回失败文件的本地地址)
     */
    List<String> failure = new ArrayList<>();

    public void upOss(final List<String> uris) {
 

        //初始化
        number = 1;
        success.clear();
        failure.clear();

        mGson = new Gson();
        HashMap<String, Object> map = new HashMap<>();
        map.put("type", "release");
        String payload = mGson.toJson(map);

        //封装post请求参数
        Map<String, Object> listMap = new HashMap<>();
        listMap.put("code", 6022);
        listMap.put("token", SPUtil.getString(mContext, Constant.LOGIN_TOKEN, ""));
        listMap.put("payload", payload);

        mDraftM.getVoucherAndUpload(listMap).subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new FilterSubscriber<Object>() {

            @Override
            public void onSubscribe(Disposable d) {
            }

            //服务器  给OSS 上传的 秘钥
            @Override
            public void onNext(Object data) {
                String stringData = String.valueOf(data);
                try {
                    JSONObject jsonObject = new JSONObject(stringData);
                    int code = jsonObject.optInt("code");
                    //需要判断code的值做不同的处理
                    if (0 == code) {
                        //请求数据成功,拆分数据
                        Upload6022Bean bean = mGson.fromJson(stringData, Upload6022Bean.class);
                        if (bean != null) {
                            //初始化阿里云OSS   秘钥
                            String accessKeyId = bean.getPayload().getAccessid();
                            String accesskeysecret = bean.getPayload().getAccesskeysecret();  //秘钥
                            String securitytoken = bean.getPayload().getSecuritytoken();

                            String endpoint = bean.getPayload().getHost();          //https://oss-cn-shanghai.aliyuncs.com
                            OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accesskeysecret, securitytoken);
                            OSS oss = new OSSClient(mContext, endpoint, credentialProvider);

                            mObjectKey = bean.getPayload().getDir();                  //hw/test/trends/
                            String bucketName = bean.getPayload().getBucketName();  //kx-common
                            mImagUrl = bean.getPayload().getImg_url();              //https://img.kx.com

                            for (String path : uris) {
                                File file = new File(path);
                                mCrypt = MD5Util.crypt(path);
                                BitmapFactory.Options options = new BitmapFactory.Options();
                                BitmapFactory.decodeFile(file.getAbsolutePath(), options);

                                //获取图片的宽高
                                int height = options.outHeight;
                                int width = options.outWidth;
                                mObjectKeyPath = mObjectKey + width + "_" + height + "_" + mCrypt + ".jpg";

                                // 异步构造上传请求  核心代码 就下面几行  再走阿里,上传给阿里
                                PutObjectRequest objectRequest = new PutObjectRequest(bucketName, mObjectKeyPath, path);

                                oss.asyncPutObject(objectRequest, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
                                    @Override
                                    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                                        String aliPath = mImagUrl + "/" + request.getObjectKey();  //https://img.kx.com/hw/test/trends/46546.jpg
                                        success.add(aliPath);
                                        if (number == uris.size()) {
                                            //返回 上传路径,以及失败的路径
                                            mJuhuaDialog.dissmiss();
                                            mPublicDyVI.onOssSuccess(success, failure);
                                        }
                                        number++;
                                    }

                                    @Override
                                    public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
                                        number++;
                                        String aliPath = mImagUrl + "/" + mObjectKey + mCrypt + ".jpg";
                                        failure.add(aliPath);
                                        if (number == uris.size()) {
                                            mJuhuaDialog.dissmiss();
                                            mPublicDyVI.onOssError(success, failure);
                                        }
                                    }
                                });

                                // 异步构造上传请求   end


                                //同步
/*                                PutObjectResult putObjectResult = oss.putObject(objectRequest);
                                String aliPath = mImagUrl + "/" + mObjectKeyPath;//https://img.vistateach.com/hw/test/trends/bf828298f10ada9eafca4c334b971a87.jpg
                                success.add(aliPath);
                                if (number == uris.size()) {
                                    //返回 上传路径,以及失败的路径
                                    mJuhuaDialog.dissmiss();
                                    mPublicDyVI.onOssSuccess(success, failure);
                                }
                                number++;*/
                            }
                            
                        } else {
                            //TODO 获取凭证信息失败
                            mPublicDyVI.onOssError(mErrorMessage);
                        }
                    } else {
                        mPublicDyVI.onOssError(mErrorMessage);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    mPublicDyVI.onOssError(mErrorMessage);
                }
            }

            @Override
            public void onComplete() {
            }

            @Override
            public void onError(String str) {
                mPublicDyVI.onOssError(str);
            }
        });

    }

三 本文核心要点多文件的同步上传or异步上传

1,同步上传:多文件同步上传没有线程或者循环问题,就是用户体验较差,需要等待
2,异步上传: 就有上面叙述问题,上传9张,效果返回多张图一样一样,本地拼接的麻烦

问题:

这里采坑是后台没做callback体封装,不返回拼接的图片下载完整地址,博主自己移动端拼接,产生循环异步问题,我们循环地址列表,循环体里面做阿里OSS上传,就会 跑1,1的回调没回来,在2的回调,回来1和2,上传OSS2张没问题,但我们本地拼接地址出问题,导致两张图一模一样.

解决:

通过回调的onSuccess(PutObjectRequest request, PutObjectResult result ) ,拿request里面的getObjectKey来拼接,result是没有body 因为我们可爱的后台偷懒了.

异步请求核心代码

 // 异步构造上传请求  核心代码 就下面几行  再走阿里,上传给阿里
                                PutObjectRequest objectRequest = new PutObjectRequest(bucketName, mObjectKeyPath, path);

                                oss.asyncPutObject(objectRequest, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
                                    @Override
                                    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                                        String aliPath = mImagUrl + "/" + request.getObjectKey();//https://img.vistateach.com/hw/test/trends/bf828298f10ada9eafca4c334b971a87.jpg

                                        success.add(aliPath);
                                        if (number == uris.size()) {
                                            //返回 上传路径,以及失败的路径
                                            mJuhuaDialog.dissmiss();
                                            mPublicDyVI.onOssSuccess(success, failure);
                                        }
                                        number++;
                                    }

                                    @Override
                                    public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
                                        number++;
                                        String aliPath = mImagUrl + "/" + mObjectKey + mCrypt + ".jpg";
                                        failure.add(aliPath);
                                        if (number == uris.size()) {
                                            mJuhuaDialog.dissmiss();
                                            mPublicDyVI.onOssError(success, failure);
                                        }
                                    }
                                });

                                // 异步构造上传请求   end

同步上传 核心代码

                                //同步
/*                                PutObjectResult putObjectResult = oss.putObject(objectRequest);
                                String aliPath = mImagUrl + "/" + mObjectKeyPath;//https://img.vistateach.com/hw/test/trends/bf828298f10ada9eafca4c334b971a87.jpg
                                success.add(aliPath);
                                if (number == uris.size()) {
                                    //返回 上传路径,以及失败的路径
                                    mJuhuaDialog.dissmiss();
                                    mPublicDyVI.onOssSuccess(success, failure);
                                }
                                number++;*/
                            }

四 额外步骤OSS缩略图应用

在原有访问地址拼接尾缀?x-oss-process=image/resize,m_fill,h_高度,w_宽度,提高图片加载速度,访问OSS定义缩略图,提高用户体验

String OSS_SMALL_PIC = "?x-oss-process=image/resize,m_fill,h_200,w_200";

运用核心代码

    @Override
    public void onSuccess(DyDetailBean6049.PayloadBean.NewsMapBean newsMap) {
        mTvAddDate1.setText(newsMap.getAdd_date());
        mTvActionText.setText(newsMap.getAction_text());
        mTvDyTitle.setText("课堂标题:  " + newsMap.getTitle());
        mTvDyContent.setText("课堂内容:  " + newsMap.getContent());
        mTv_lesson_time.setText("上课时间:  " + newsMap.getLesson_time());

        final String img_url = newsMap.getImg_url();
        if (!TextUtils.isEmpty(img_url)) {
            //图片地址数组
            final String[] split = img_url.split(",");
            //拼接缩略图尾缀
            for (int i = 0; i < split.length; i++) {
                split[i] = split[i]+ AppConfig.OSS_SMALL_PIC;

            }
            ItemImgAdapter itemImgAdapter = new ItemImgAdapter(this, split);
            mRv.setLayoutManager(new GridLayoutManager(this, 3));
            mRv.setAdapter(itemImgAdapter);

            itemImgAdapter.setOnItemClickListener(new LessonDetaiAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    // 点击查看大图
                    Intent intent = new Intent(DyDetailActivity.this, VpActivity.class);
                    intent.putExtra("paths", img_url);
                    intent.putExtra("position", position);
                    startActivity(intent);
                }
            });
        }
    }

五 尾言

为自己技术增值,量变引起质变.对象亦来源于生活,模式亦来源于验证的OO经验,那么请学会使用轮子,再到感受制造轮子的乐趣,你会发现原来编程那么美妙.如有错误或不当之处,请读者留言,博主好吸取经验,互相交流学习,如果本文对你有帮助请帮博主点赞,发注一波,谢谢善良的读者

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓Android阿里OSS上传图片(缩略图使用)三步完成+源码例子 的相关文章

  • nginx与ftp服务器出现403错误

    默认的yum安装 ftp的路径是在 etc vsftpd xff0c 这时候通过上面创建的 用户从 FTP登陆后 进入 home目录就可以查看到ftpuser文件夹 上图这里有个小细节就是在Linux中 xff0c 创建一个文件时 xff0
  • 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor xff0c 一款是OV的5M YUV sensor xff0c 支持jpeg out xff0c 同时也支持AF xff0c 调试比较比较简单 xff0c 因为别
  • 7 计算机组成原理第五章 中央处理器 数据通路

    文章目录 1 数据通路的功能和基本结构单总线1 1 数据通路的功能1 2 数据通路 基本结构单总线 2 数据通路 CPU内部单总线方式2 1 三种结构之间数据传送方式2 2 CPU内部单总线方式 例题 3 专用通路3 1 专用数据通路方式3
  • Python 记录日志简单好用,功能齐全(Loguru)

    Loguru 一个能彻底解放你的日志记录器 它即插即用 xff0c 具备多种方式滚动日志 自动压缩日志文件 定时删除等功能 除此之外 xff0c 多线程安全 高亮日志 日志告警等功能也不在话下 下面就给大家介绍一下这个强大工具的基本使用方法
  • linux设备驱动——andriod平台wlan驱动II——给军爷的答案

    转自 http wsqhs spaces live com c11 BlogPart BlogPart 61 blogview amp c 61 BlogPart amp partqs 61 amonth 3d4 26ayear 3d200
  • Linux 下 如何打 PATCH 及制作 DIFF

    Linux下patch的制作和应用 因为在u boot移植过程中 xff0c 有几处通用文件要修改 xff0c 如果每次都要手动修改就太麻烦了 制作补丁可以解决这个问题 学习资料的收集比较简单 xff0c 方法一类似于这种初级问题网上资料非
  • LINUX GIT 使用

    git show HEAD git show HEAD git show HEAD git show HEAD git diff 486ec madplay player c git diff 4863 856f git diff 4863
  • LINUX 输入子系统分析

    1 输入子系统架构Overview 输入子系统 xff08 Input Subsystem xff09 的架构如下图所示 输入子系统由 输入子系统核心层 xff08 Input Core xff09 xff0c 驱动层和事件处理层 xff0
  • Linux Kernel and Android 休眠与唤醒

    Table of Contents 简介 国际化 版本信息 对于休眠 suspend 的简单介绍 Linux Suspend 的流程 相关的文件 准备 冻结进程 让外设进入休眠 Resume Android 休眠 suspend 涉及到的文
  • 浅析linux下键盘设备工作和注册流程

    span style color 000000 a href http qgjie456 blog 163 com blog m 61 0 span style font size 6 http qgjie456 blog 163 com
  • linux内核信号处理

    信号是操作系统中一种很重要的通信方式 近几个版本中 信号处理这部份很少有大的变动 我们从用户空间的信号应用来分析Linux内核的信号实现方式 一 信号有关的数据结构 在task struct中有关的信号结构 struct task stru
  • win7和ubuntu双系统,直接进入windows启动项选择菜单,而不进入grub的解决方案。

    一 Ubuntu 采用 grub 引导 xff0c 首先要将 grub 引导去掉 xff0c 重建 windows mbr 引导 xff0c 下载 MbrFix exe 并将它放到 C 盘根目录 xff08 其他目录也可 xff09 xff
  • 带你搞明白Zookeeper选举机制

    没什么 xff0c 搞不明白别打我就行 xff0c 初学者如有问题请及时指正 xff01 在上一篇文章我们有介绍3种server角色 xff1a Leader Follower以及Observer xff08 不参加选举 xff09 xff
  • windows远程linux桌面

    TigerVNC是一个高性能 平台无关的虚拟网络计算 xff08 Virtual Network Computing xff0c VNC xff09 实现 xff0c 是一个客户端 服务器应用程序 xff0c 允许用户在远程机器上启动并与图
  • 循环队列的介绍与实现

    文章目录 1 循环队列定义2 循环队列基本操作3 循环队列代码实现4 补充 1 循环队列定义 循环队列 xff1a 即顺序存储的队列 xff0c 是为了避免 假溢出 而利用 运算符将队列首尾相接连成一个环状的队列 xff0c 称为循环队列
  • AndroidStudio4.1 升级Kotlin插件不生效问题

    背景 xff0c 在使用SAM转换写Livedata observe 的第二个参数时 xff0c 发现AS报红 xff0c 但编译不出错 xff0c 功能也能正常运行 然后就尝试升级Kotlin插件 AndroidStudio4 1 默认带
  • 一个中科大差生的8年程序员工作总结

    今年终于从大菊花厂离职了 xff0c 离职前收入大概60w不到吧 xff0c 在某乎属于比较差的 xff0c 今天终于有空写一下自己的职场故事 xff0c 也算是给自己近8年的程序员工作做个总结复盘 近8年有些事情做对了 xff0c 也有更
  • 如何一步一步成为一个领域专家

    经常有人问我 xff0c 为什么有的人工作10年仍然平台无奇 xff0c 而有的人只用3年时间 xff0c 就已经脱颖而出 xff0c 成绩斐然 我说 xff0c 是呀 xff0c 有些参加工作多年却仍然只会复制粘贴简单业务代码 xff0c
  • 如何一步一步建立自己的技术影响力

    很多朋友是不是有这样的经历 xff0c 当我们还是一个菜鸟的时候 xff0c 团队里总有1 2个技术大拿 xff0c 每当有技术问题大家争论不休 xff0c 团队成员讨论的面红耳赤 xff0c 技术大牛实在看不下去 xff0c 掐灭手中的烟
  • 一个老程序员的一些职场经验分享

    有一些关于职场的经验 xff0c 当然有一些是以前总结过的 xff0c 现在归类总结一下 xff0c 上半部分是通用职场 xff0c 下半部分是程序员专用 一 通用职场经验 1 xff09 很多人认为事情做得多 xff0c 事情做得好就能晋

随机推荐

  • 第2章 第一个Spring Boot项目

    开发工具选择 工欲善其事必先利其器 xff0c 我们进行Java项目开发 xff0c 选择一个好的集成开发工具 xff08 IDE xff09 对提高我们的开发调试效率有非常大的帮助 这里我们选择大名鼎鼎的IDEA xff0c 它全称 In
  • 第8章 使用注解的方式整合MyBatis 入门详解

    目录 注解方式和配置文件方式的优缺点 使用注解方式整合MyBatis 添加依赖 配置application properties文件 在启动类上添加apperScan注解 创建mapper接口和实体类目录 添加实体类 测试验证 添加参数 直
  • 第9章 Spring Boot整合JPA 与 JpaRepository 基础方法介绍

    参考文章 xff1a 第1章 Spring Boot到底是什么 xff1f 陈小房的博客 CSDN博客 第2章 第一个Spring Boot项目 陈小房的博客 CSDN博客 第3章 Spring Boot项目配置详解 陈小房的博客 CSDN
  • 新手程序员快速升职项目经理(程序员小故事1)

    xff08 刚编的小故事 xff0c 希望对新入门的程序员有所帮助 xff09 英雄 无用武之地 小谢今年从XX大学计算机专业毕业 xff0c 和很多大学生不一样 xff0c 小谢在学校没有将时间用于开黑玩游戏 谈恋爱 xff0c 而是将时
  • Windows鼠标右键添加cmd

    1 win 43 R 打开windows运行 2 在文本框输入regedit 搜索 3 在HKEY CLASSES ROOT当中找到Folder 4 在Folder中找到shell 5 右键shell新建项cmdPrompt 6 点击cmd
  • MIPS指令与MIPS汇编语言

    文章目录 1 MIPS简介2 MIPS指令系统的特点3 MIPS寄存器4 MIPS指令格式4 1 R Type型指令4 2 l Type型指令4 3 J Type型指令4 4 三类指令小结 5 MIPS例题6 MIPS过程调用6 1 过程调
  • 一加7Pro(oneplus 7Pro)和一加三安装kali nethunter

    准备条件 xff1a 一台一加7Pro手机谷歌的adb和fastboot工具集 工具包名称 xff1a platform tools氧OS线刷包 10 3 0版本 twrp 非官方版本magiskDisable Dm Verity Forc
  • 如何解除Chrome无法安装第三方插件的限制(无法从该网站加载扩展程序和用户脚本)

    2018年6月谷歌宣布将废除 Chrome 扩展的内联安装方式 xff08 inline installation xff09 所以说 xff0c 自Chrome 67版本开始 xff0c 谷歌调整Chrome的插件安装策略 xff0c 只
  • 【STM32】HAL库——定时器溢出中断

    经过多次调试 xff0c 我发现Proteus 8的仿真效果并不是很理想 xff0c 所以接下来的例程将改用STM32F103RCT6单片机实物进行讲解 前期准备 xff1a STM32CubeMXSTM32RCT6核心板IDE Keil
  • 【Hexo】GitHub_Page绑定阿里云域名

    前言 对于使用GitHub Pages的小伙伴来说 xff0c GitHub自带的xxx github io网址 xff0c 很容易被挡掉 xff0c 就像这样 我猜大概率是因为这种网址没有证书 没备案之类的 xff0c 导致浏览器检测不安
  • No cached version of com.android.tools.build:aapt2:3.3.2-5309881 available for offline mode.

    No cached version of com android tools build aapt2 3 3 2 5309881 available for offline mode 处理 xff1a gradlew assemble 清理
  • Android H5 webView加载过程黑屏优化处理

    Android H5 webView加载过程黑屏优化处理 一 问题 H5内嵌页面时 xff0c 用webView加载过程中出现黑屏 xff1a 优化处理 xff0c 在setWebViewClient的onPageStarted和onPag
  • 【无标题】

    Android ADB相关使用 Android ADB相关使用 获取手机安卓系统版本 xff1a adb shell getprop ro build version release获取手机SDK版本 xff1a shell getprop
  • Android APP间授权登录(无需SDK类似微信登录)(源码+解析)

    Android APP间授权登录 无需SDK类似微信登录 源码 43 解析 文章目录 Android APP间授权登录 无需SDK类似微信登录 源码 43 解析 前言一 需求二 A应用 调用者 业务代码与布局三 B应用 授权应用 业务代码
  • Android APP调起小程序流程源码+实例解析

    Android APP调起小程序流程源码 43 实例解析 刚刚完成的一个工作需求功能 APP调起指定小程序 读者比较喜欢有图看效果 再看内容 本文涉及点比较多 1 微信SDK集成 2 微信小程序开发 博主后面有充裕的时间会详细对这些知识点做
  • 安卓Android与H5双向交互MathJax展示数学公式(源码+解析)

    安卓Android与H5双向交互MathJax展示数学公式 源码 43 解析 博主就今天周五又做了个需求 xff08 安卓Android与H5交互 xff09 xff0c 原来上线的功能是服务器配置过来的学习报告 xff08 一个H5页面
  • 1 计算机网络体系结构与OSI参考模型

    文章目录 1 计算机网络概述1 1 计算机网络概念1 2 计算机网络的分类 2 OSI 七层参考模型应用层表示层会话层传输层网络层数据链路层物理层 3 OSI参考模型与网络排错4 OSI参考模型与网络安全5 TCP IP协议和OSI参考模型
  • Android之cardview属性以及阴影处理源码+实例

    Android之cardview属性以及阴影处理 开发中 项目会含有大量的图片需要展示 需要圆角图片 带圆角的组合控件等 本文对cardview使用 以及属性做开发记录 方便后来者查阅 博主也容易忘东西 先看效果图 博主开发的一个VR中控平
  • Android自定义底部弹出窗-dialog(2种实现分析+源码)

    Android自定义底部弹出窗 dialog 2种实现分析 43 源码 上线项目功能抽取 在项目开发中 我们会在许多地方会用到底部自定义弹窗 比如设置 个人账户退出 切换 照片的拍照或者相册的调出 或者一些底部弹出列表 本文对自定义底部弹出
  • 安卓Android阿里OSS上传图片(缩略图使用)三步完成+源码例子

    安卓Android阿里OSS上传图片 缩略图使用 三步完成 43 源码例子 博主在做这块阿里OSS上传 也是踩过不少相关的坑 并且阿里的官方文档也是不是很详细 也翻阅不少文章 感觉有所不足 所以记录本文 希望对后面采坑的读者有所帮助 本文目