技术干货 | “选图预览并上传”的场景如何解?全网最全方案汇总来了

本文涉及的产品
mPaaS订阅基础套餐,标准版 3个月
简介: 你真的知道如何“上传”一张照片吗?

封面图0108.png

选择本地相册图片或者拍照,然后预览并且上传是移动应用中一个典型的使用场景,比如常见的身份证信息上传等。

不少客户都反馈有类似的场景,并且在使用上都或多或少的遇到一些问题,最后找到 mPaaS,希望我们能够提供一些最佳实践。在这里分享下对应场景的一些优化解决方案。

选图方案

方案1:使用 Android 原生 Webview

前端通过 input 标签,指定 type=file,通过原生 webview 的支持实现选择文件。

Android 原生 webView 并不支持选择文件上传,需要外壳自己扩展 WebChromeClient 里的 openFileChooser 或者 onShowFileChooser,然后去唤起系统选择文件弹框,选择文件会使用系统提供的组件或者其他支持的 app,返回的 uri 有的直接是文件的 url,有的是 contentprovider 的 uri,需要统一处理一下返回 uri 格式。

这种方案存在以下问题:

  • 外壳定制实现的逻辑较多,还需要对系统不同文件选择器返回的地址做兼容,容易有兼容性问题;

  • 选择文件实现依赖系统的文件选择器,不同手机实现不一致,无法做到统一;

方案2:使用 mPaas 的 H5 容器

如果业务使用了 mPaas 的 H5 容器后,虽然容器内已经内置了唤起文件选择器的一系列操作,但是还是一样存在系统文件选择器不可控的风险。比如如果业务希望选择的是一张图片,但是唤起后的效果可能是下面这个样子,部分客户也是无法接受的。

1.png

方案3:实现 jsapi 唤起 Native 自定义的选图页面

这种方案就是利用 H5 容器提供的自定义 jsapi 的能力,自定义一个选图的 jsapi,然后前端去调用,去唤起 Native 自己实现的选图页面,最后结果通过 base64 的形式返回给前端做显示。这样就解决了前面提到系统选择文件不可控的问题。

但是当这个方案上线后,还是遇到了一些问题,主要因为通过 jsbridge 只能返回 json,所以图片数据是通过 base64 的形式返回的。但是因为有多选的场景,如果用户选择了多张图片后,返回的 base64 数据会特别大,导致在一些低端设备上有一些 OOM 的问题,同时大量 base64 转 JSON 的过程中,也会出现 ANR。所以也是不能上线的。

方案4:选图返回本地路径,WebView 拦截访问本地资源

为了解决前面提到的返回 base64 存在的稳定性问题,所以我们在选图的时候,是返回了一个本地的地址,然后 Native 模块拦截 WebView 的资源访问,去本地拿到对应的图片返回给 WebView 显示。

比如选图后返回给 WebView 的地址是:https://www.mPaas.com.cn/mpaas.jpg,www.mPaas.com.cn 是我们自定义的一个域名,我们拦截这个特定自定义域名,然后去本地相册去找 mpaas.jpg对应的图片拦截返回。通过这样的一个转换逻辑,解决了 base64 传递的问题。

文件上传方案

通过以上的描述,我们对比了各种选图方案实现的优缺点,最后沉淀了最佳实践。选图实现了后,下一步就是上传。对于上传也经历了类似的方案演进。

方案1:使用 RPC 接口上传

对于使用了 mPaas 的用户,第一步想到的肯定是通过 RPC 接口实现文件的上传,但是在实际验证过程中,我们发现对于一些比较大的图片上传,RPC 接口直接返回了 403 的报错:Http Transport error[413] : Request Entity Too Large]. 很明显是因为文件过大导致服务端挂掉了。

主要因为 RPC 的定位是用做业务数据通道,一般建议的大小是 200K 以内,对于直接上传大文件的数据,会有稳定性风险,甚至因为这个把整个网关打挂。

2.png

方案2:使用 OSS 方案上传

对于类似的文件上传场景,建议是直接使用 OSS 的方案进行上传,比如常见的阿里云 OSS 方案:help.aliyun.com/product/31815.html。

OSS 是专门为解决文件存储整条链路设计的一套方案,解决了文件上传的各种场景,用户可以集成对应的 Android 和 iOS 的 SDK 实现对本地文件的上传。

结语

仅仅是一个选图上传预览这样一个场景,就可以有这么多不同的方案演进,没有最好的方案,只有最合适的方案。如有更多技术问题,欢迎钉钉搜索“32930171”加入 mPaaS 技术交流群。

作者名片-荣阳.jpg

- END -

动态-logo.gif

底部banner.png

相关文章
|
10月前
|
大数据 索引 Python
Python判断for循环最后一次
通过本文的介绍,您应该能掌握几种在Python中判断for循环最后一次迭代的方法。根据具体的应用场景和数据结构选择合适的方法,可以提高代码的可读性和运行效率。
198 59
|
10月前
|
JavaScript
时尚简洁的js轮播图特效插件
这是一款时尚简洁的js轮播图特效插件。该轮播图采用es6语法制作,底部带缩略图和描述信息。图片和描述信息在切换时同步滑动。
|
10月前
|
Serverless BI
有奖实践,基于EMR StarRocks实现游戏玩家画像和行为分析
阿里云EMR-StarRocks联合镜舟科技,基于EMR-StarRocks实现游戏实时湖仓分析,免费试用物化视图、Paimon写入查询等新能力,前45位赢取StarRocks定制T恤、Lamy钢笔,小米充电宝,阿里云拍拍灯等活动礼品,前500位均可获得创意马克杯。
262 7
|
10月前
|
缓存 安全 网络协议
使用事件日志识别常见 Windows 错误
事件查看器是Windows操作系统中的标准诊断工具,用于记录系统事件,包括硬件问题、软件中断和系统行为等详细信息。通过分析这些日志,管理员能够追踪和解决系统错误。访问方法包括使用快捷键Win + R输入eventvwr.msc,或通过控制面板进入。事件查看器中的每条记录包含事件ID、来源和描述,帮助识别和解决问题。常见错误如蓝屏死机、DLL错误、驱动程序错误等,可通过更新驱动程序、运行系统诊断、使用恢复功能等方式解决。
661 4
|
10月前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
随着云计算技术的飞速发展,越来越多的企业和个人开始使用云服务。然而,云计算的广泛应用也带来了一系列网络安全问题。本文将从云服务、网络安全、信息安全等方面探讨云计算与网络安全的关系,分析当前面临的挑战,并提出相应的解决方案。
208 3
|
机器学习/深度学习 数据采集 数据挖掘
【Python入门系列】第九篇:Python数据分析和处理
Python数据分析和处理是当今数据科学领域中的重要技能之一。随着大数据时代的到来,越来越多的组织和企业需要从海量数据中提取有价值的信息。Python作为一种功能强大且易于上手的编程语言,提供了丰富的数据分析和处理工具和库,如pandas、numpy、matplotlib等。本文将介绍Python数据分析和处理的基础知识和常用操作。
494 1
design域名,塑造专业网络形象
阿里云企航.design域名,完美地向你的潜在客户展示专业技能所在
353 0
design域名,塑造专业网络形象
|
Java 调度 数据库
坑爹!Quartz 重复调度问题,你遇到过么?(2)
坑爹!Quartz 重复调度问题,你遇到过么?
391 0
坑爹!Quartz 重复调度问题,你遇到过么?(2)
|
网络协议 Java 开发工具
Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构
Spring官方的RSocket Broker其实开发已经非常久了,我以为会伴随着Spring Cloud 2021.0发布的,但是没有发生。不过Spring RSocket Broker还是发布了最新的0.3版本,虽然还是预览版,但目前已经可用,考虑官方还没有提供对应的文档,大家入门做Demo还有些困难,所以这篇文章就是帮你快速入门Spring RSocket Broker,同时解析一下RSocket Broker的特性。
Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构
|
存储 关系型数据库 MySQL
庖丁解InnoDB之REDO LOG
数据库故障恢复机制的前世今生一文中提到,今生磁盘数据库为了在保证数据库的原子性(A, Atomic) 和持久性(D, Durability)的同时,还能以灵活的刷盘策略来充分利用磁盘顺序写的性能,会记录REDO和UNDO日志,即ARIES方法。本文将重点介绍REDO LOG的作用,记录的内容,组织结构,写入方式等内容,希望读者能够更全面准确的理解REDO LOG在InnoDB中的位置。本文基于MySQL 8.0代码。
庖丁解InnoDB之REDO LOG