当前位置:主页 > 技术方案 >

安卓本地webView不支持上传选中的文件

发布时间:2021-01-10 19:29   浏览次数:次   作者:admin
在移动应用中,通常会使用本地相册图片或拍照,然后预览上传,例如上传常用的身份证信息。
许多用户已经报告了类似的情况,并且在使用中遇到了一些问题。最终他们发现了mPaaS,并希望我们提供一些最佳实践。本文将介绍相应场景的一些优化解决方案。
图样选择方案
第一种方法:使用Android原生Webview。
前端通过输入标签指定type=file,然后通过webview支持来选择文件。
安卓本地webView不支持上传选中的文件,因此shell需要将openFileChooser或onShowFileChooser扩展到WebChromeClient本身,然后调用系统选择文件。由系统或其他支持应用程序提供的组件将被用来选择文件、返回URI、文件的url、contentprovider的uri,因此必须对返回的URI格式进行统一处理。
这个计划有以下问题:
外壳定制有很多逻辑,需要与系统中不同文件选择器返回的地址兼容,容易产生兼容性问题;
根据系统中的文件选择器来选择文件实现,不同手机不一致,无法统一;
计划2:使用H5集装箱在海洋保护区。
当服务使用mPaas的H5容器时,尽管在容器中建立了调用文件选择器的操作序列,但仍有系统文件选择器无法控制的风险。例如商家希望选择一幅图片,但诱导的效果可能如下,一些顾客无法接受。
第三种方法:实现jsapi,激发网络自定义地图选择页面。
这种方案是利用H5容器提供的自定义jsapi功能,自定义用于图像选择的jsapi,然后前端调用它来调用Native自己实现的图像选择页面,最后将结果作为base64返回给前端显示。这样就解决了上述系统文件选择的不可控问题。
但该方案推出后仍然遇到了一些问题,主要是json只能通过jsbridge返回,因此图片数据返回为base64。但因为有很多场景,如果用户选择了多个图片,返回的base64数据将会很大,导致一些低端设备出现一些OOM问题,而且在base64到JSON的转换期间还会出现ANR。因此,联机是不可能的。
第四种情况:WebView通过选择地图返回本地路径来截取对本地资源的访问。
为解决上述返回base64的稳定性问题,我们在选择图片时返回本地地址,然后Native模块截取WebView的资源访问,到本地获取相应的图片,返回给WebView显示。
举例来说,选择图片后返回到WebView的地址是:https://www.mPaas.com.cn/mpaas.jpg,用户可以定制域名http://www.mPaas.com.cn。我们截取了这个特定的定制域名,然后在本地相册中找到了相应的mpaas.jpg图片并将其删除。使用这种转换逻辑,可以解决base64的传输问题。
档案上载计划
根据上述说明,我们对比了各种图样选择方案的优缺点,最后得出最佳做法。实现了图像的选择,下一步就是上传。上载方案经历了类似的演变。
第一种方案:使用RPC界面上传。
对使用mPaas的用户而言,第一步必须是通过RPC界面上传文件。但在实际验证过程中,我们发现,对于某些大型图片上传,RPC界面直接返回403错误:httptransporterror[413]:requestentitytolarge。很明显,服务器由于文件太大而被挂起。
由于RPC主要定位于业务数据通道,建议的大小一般在200KK以下,对于直接上传到大文件的数据,会有稳定性风险,甚至会因此挂起整个网关。
第二种方案:使用OSS模式上传。
在类似的文件上传场景中,建议直接使用OSS方案如阿里巴巴云OSS方案:http://help.aliyun.com/product/31815.html.上传。
OSS是专门针对文件存储的整个过程而设计的一套解决方案,适用于各种场景下的文件上传。使用者可以整合Android和iOS上的SDK,以便上传本地文件。
总结。
只要选一个图片就可以上传预览这样的场景,那么各种不同的方案都可以进化,没有最佳方案,只有最适合的方案。
-终止-