作者:水歌
链接:https://www.zhihu.com/question/21452742/answer/34164634
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下是 网上搜索文档、团队实战经验的总结,主要基于 Android 4.0+、iOS 6.0+、微信 5.2+ ——

  1. 过去限制很多的 iOS 版微信 却没出什么大问题,反倒 Android 各版本的适配让我们各种加班
  2. 较新版本的微信并没有对 HTML 原生文件控件做限制,只是它默认调用 Android 系统自带的 WebView,限制是怎样的取决于相应版本 Android 的官方代码(有说法是出于安全考虑)
  3. 除了 Android v4.4.2 这个中间版本(小米 3、红米 Note 等机型的出厂系统),其它 v4.x 版本的 WebView 基本都可以使用 原生文件控件
  4. 若同机安装有 QQ浏览器,微信可以调用它修缮过的内核,就可以正常使用文件控件(但必须在安装 QQ浏览器之后重启微信才行)
  5. 如有某版本的 WebView 不能用文件控件,它的拦截是在底层进行的,所以 JavaScript 引擎层面并无异常抛出,不会中断程序的执行

再分享一段我手写的 Input File 图片友好版 v0.5 的代码( jQuery 插件)——

// -------------------------------------------------- //
//
//          >>>  Input-File 图片友好版  <<<
//
//
//    [Based on]    jQuery,  jQuery.Browser.js
//
//    [Version]     v0.5  (2015-7-3 14:26:30)
//
//
//        (C)2014-2015    test_32@fyscu.com
//
// -------------------------------------------------- //(function (BOM, DOM, $) {var URL_Object = BOM.webkitURL || BOM.URL || BOM;$.fn.xImage = function (Type_Filter) {var $_This = this.find('*').addBack().filter('input[type="file"]');Type_Filter = Type_Filter || [ ];$_This.parent().css({position:    'relative',cursor:      'pointer'});$_This.css({position:     'absolute','z-index':    999,opacity:      0}).each(function () {var $_This = $(this);var $_PreView = $_This.siblings('img, img.PreView').eq(0);if (! $_PreView.length)$_PreView = $('<img />').before($_This);$_PreView.addClass('PreView').css({display:          'inline-block','max-height':     $(top).height() * (1 / 3),'max-width':      $(top).width() * (1 / 3)}).on('Ready',  function () {$_This.css({top:       $_PreView.position().top,left:      $_PreView.position().left,width:     $_PreView.width(),height:    $_PreView.height()});}).trigger('Ready').on('load',  function () {$_PreView.trigger('Ready');});}).data('clicks', 0).click(function () {var $_This = $(this);var Click_Times = $_This.data('clicks');if ($.browser.mobile && (++Click_Times > 3)) {BOM.alert("您当前的浏览器无法在本页上传文件……");return false;}$_This.data('clicks', Click_Times);}).change(function () {var $_This = $(this).data('clicks', 0);try {var iFile = arguments[0].target.files[0];} catch (iError) {BOM.alert(["您当前 浏览器内核 较为古老,暂不支持【图片上传预览】……","建议更换为最新版 搜狗、猎豹、傲游 等双核浏览器~"].join("\n\n"));$_This.show().siblings('img.PreView').remove();return true;}var iType = iFile.type.split('/');if (iType[0] != 'image') {BOM.alert("您所选的文件不是图片……");return false;} else if ($.inArray(iType[1], Type_Filter) > -1) {BOM.alert(["此处不能上传", iType[1].toUpperCase(), "格式的图片!"].join(' '));return false;}var iReader = new FileReader();iReader.onload = function () {$_This.siblings().not('img.PreView, input[type="file"]').hide();var $_PreView = $_This.siblings('img.PreView');$_PreView[0].onload = function () {URL_Object.revokeObjectURL(this.src);};$_PreView[0].src = URL_Object.createObjectURL(iFile);};iReader.readAsBinaryString(iFile);});return this;};})(self,  self.document,  self.jQuery);

其对应的 HTML 结构是 ——

<form method="POST" action="./xxx"><div class="ImageBox"><input type="file" /><span>上传美照</span></div><button type="submit">完成</button>
</form>
<script>//  原生文件上传控件“图片友好化”,//  并排除一些服务器处理不了的格式$('.ImageBox').xImage(['psd', 'webp', 'bpg']);
</script>

对于 DOM/JS 层面实在无法直接支持文件控件的,有两种备用方案 ——

  1. 引导失败的用户在其微信公众平台的主界面消息框中发送图片消息,服务器端做好相应接口支持
  2. 指导用户下载安装 QQ浏览器并重启微信(微信内下载只有 腾讯应用宝的链接可正常使用,否则就只能再打开一个下载网页并引导用户在其它手机浏览器中打开它去下载)

【插件备注】
  若用户多次点开文件选择对话框,但都没选择文件时(即 Change 事件从未触发),本插件可能也会判断为“当前浏览器文件控件被屏蔽”。

微信内置的浏览器如何上传文件相关推荐

  1. vue仿抖音视频列表(兼容微信内置X5浏览器)

    vue 仿抖音视频列表(兼容微信内置X5浏览器)https://blog.csdn.net/superKM/article/details/87603255制作 仿抖音视频列表遇到很多坑,特别是安卓微 ...

  2. 微信小程序云开发实现上传文件和预览下载文件

    微信小程序云开发实现上传文件和预览下载文件 一.前言 目前微信提供了一个接口 wx.chooseMessageFile 它能让用户从聊天记录里面选择一个或者多个文件,然后返回它的一些信息,列入文件的p ...

  3. 通过运营界面上传图片失败,浏览器提示上传文件时发生HTTP错误(错误代码:500)

    通过运营界面上传图片失败,浏览器提示上传文件时发生HTTP错误(错误代码:500) ERROR exception 135 Internal Server Error: /ckeditor/uploa ...

  4. 小程序上传音频失败_微信小程序实现录音后上传文件方法详细

    本篇文章讲述了微信小程序实现录音后上传文件方法,大家对微信小程序实现录音后上传文件方法不了解的话或者对微信小程序实现录音后上传文件方法感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧 ...

  5. 微信内置h5浏览器 getBrandWCPayRequest支付

    目录 getBrandWCPayRequest支付 什么是getBrandWCPayRequest支付? 如何使用getBrandWCPayRequest支付? getBrandWCPayReques ...

  6. 公众号微信内置地图在ios上不显示问题

    微信公众号内调用微信内置地图,在安卓上可以正常显示,但是在ios上显示一片空白,而且报错:fail invalid_coordinate 解决方法: 微信小程序默认将组件上绑定的参数都当作字符串了,所 ...

  7. 仿抖音视频自动播放html,vue 仿抖音视频列表(兼容微信内置X5浏览器)

    制作 仿抖音视频列表遇到很多坑,特别是安卓微信内置浏览器,让人脑壳疼,核心代码不多 便于理解 组件用到了vant 中的swiper滑动组件 h5 原生 video 属性 webkit-playsinl ...

  8. 微信小程序云开发-批量上传文件到云储存空间

    微信小程序开发 自己最近在玩微信小程序,准备记录一些自己遇到的,网络上没有对应教程(也许是自己没找到),或者是教程比较少的问题,然后给出自己的解决方案 目录 微信小程序开发 问题 一.云储存是什么? ...

  9. JS:Vue项目浏览器直接上传文件到阿里云OSS

    OSS Browser.js SDK文档: https://help.aliyun.com/document_detail/64041.html OSS设置路径:权限管理-跨域设置 将来源设置成 * ...

最新文章

  1. CentOS各版本挂载光盘做yum源安装
  2. C#-DataSet和DataTable详解
  3. jmeter设置全局变量
  4. Leetcode--22. 括号生成
  5. Java-Scanner进阶使用
  6. Specification for springger thesis Writing
  7. redis和sqlserver数据同步_SQLServer数据库之redis数据库的数据导入到SQLServer数据库中...
  8. Html 中判断某个class的个数
  9. Satwe楼板能用弹性模计算吗_SATWE软件计算结果分析
  10. mescroll使用上拉加载、下拉刷新
  11. 第1关:身份证归属地查询
  12. POJ2545-丑数
  13. android自己监听home键,Android中监听Home键的4种方法总结
  14. 浅谈程序员接私单那点事及接私单需要注意的问题
  15. C语言常用的数学函数
  16. phpwind9.0 read.php 修改,phpwind9.0模板制作教程——制作论坛风格
  17. 最新阿里巴巴面试官内部题库,2022年Java岗社招必备~
  18. linux、linux虚拟机相关
  19. aspectj框架切入点表达式
  20. Python数据可视化的3大步骤

热门文章

  1. 【iphone】开发者传授APP开发,审核,发布流程!
  2. 上传微信小程序项目到Github
  3. ios android 比较大小,对比苹果iOS,安卓7.0的七个优点
  4. 转:高手速成android开源项目【View篇】 .
  5. 排序算法整理(冒泡、选择、快排、堆排序、希尔、归并)
  6. Pandas之skew,求偏度
  7. 2020读书笔记 《马歇尔传记》
  8. 适合php编程的笔记本电脑,【求推荐】(女生用/编程) 的 笔记本(Thinkpad) - 笔记本电脑(Notebook)版 - 北大未名BBS...
  9. 免费开源的工程师项目管理系统
  10. 墨海醉笔,又流逝了多少华年?