文件(图片)上传调研: HTML 5 vs. Flash

安全结
• 阅读 7325

浏览器占有率

来源:百度相册

浏览器占有率

浏览器 占有率
Chrome 52.94%
IE 44.32%
FF 1.97%

IE版本占有率

浏览器 占有率
IE6 6.55%
IE7 0.57%
IE8 27.33%
IE9 9.87%
IE10 <5%

上传数据统计

来源:百度相册

大小区间    (0,100K)    [100K,300K) [300K,500K) [500K,800K) [800K,1M)   [1M,3M) [3M,5M) [5M,7M)[7M,9M)  [9M,11M)    [11M,15M)   [15M,20M)   [20M,30M)   [30M,50M)
百分比 41.86%  21.25%  7.89%   5.18%   2.94%   13.04%  4.78%   2.22%   0.50%   0.16%   0.11%   0.04%   0.02%   0.01%

文件(图片)上传调研: HTML 5 vs. Flash

功能调研

文件选择

方式 IE6 IE7 IE8 IE9 IE10 Chrome FF
单选 O O O O O O O
多选 X X X X O O O
拖拽 X X X X O O O

文件信息

属性 说明 IE9 IE10 Chrome FF iOS Android
name 文件名称 X O O O 6.0 3.0
lastModifiedDate 文件最后修改日期 X O O O 6.0 3.0
size 文件大小 X O O O 6.0 3.0
type 文件类型,HTTP协议中Content-Type格式。 X O O O 6.0 3.0

文件内容读取

方法 说明 IE10 Chrome FF iOS Android
readAsDataURL 按DataURL格式读取文件内容,适用于图片文件。 O O O 6.0 3.0
readAsText 读取文本文件内容。 O O O 6.0 3.0
readAsArrayBuffer 按字节读取。 O O O 6.0 3.0
readAsBinaryString 读取文件并返回二进制字符串。 X O O 6.0 3.0

图片预览

方式 IE10 Chrome FF iOS Android
readAsDataURL O O O 6.0 3.0
createObjectURL O O O 6.0 4.0

图片裁剪

IE10 Chrome FF iOS Android
O O O 6.0 3.0

图片压缩

IE10 Chrome FF iOS Android
O O O 6.0 3.0

Javascript 与 Flash通信

考虑到Javascript在某些情况下的局限性,可能需要与Flash协作,因此需要Javascript具有与Flash通信的能力。

序列化数据通信:支持;但是需要读取文件序列化后的内容,比如BASE64,内存占用可能会比较大;

二进制数据通信:待验证;

异步文件上传

方式 说明 IE10 Chrome FF
XHR send(FormData) 构造FormData发送,HTTP请求与FORM提交一致,后端无需做额外适配通用。 O O O
XHR sendAsBinary 结合FileReader的readAsBinaryString使用。 X O1 O
XHR send(Blob) 直接发送File对象,浏览器不会进行编码而是直接把Blob内容作为POST DATA,需要后端自行解析。 O* O* O*
XHR send Base64 通过FileReader的readAsDataURL方法获取图片Base64编码,以文本方式发送到后端处理,需要后端自行解析。 O* O* O*
WebSocket send binary 通过FileReader获得Blob或ArrayBuffer,通过WebSocket发送到后端,需要后端获取数据并解析。 O* O* O*

1可模拟;
*服务器端需要适配;

性能评测

评测的两个方面:

  • HTML5与Flash共同拥有的功能进行对比;
  • HTML5某个功能的不同实现进行比较;

预览

图片预览在HTML5和Flash均可实现,同时HTML5本身有两种实现方式,因此同时参与评测。

下图为使用FlashHTML5 DataURLHTML5 ObjectURLHTML5 DataURL with resizeHTML5 ObjectURL with resize五种方式进行图片预览时所消耗的内存比较:

方式 100K 300K 500K 800K 1M 3M 5M 10M ALL Extreme(600M / 274 Files)
Flash 1 1 1 1 1 4 7 22 50 650
H5 DataURL 2.6 12.6 18.2 22.7 27.6 122 172 252 591 N/A
H5 ObjectURL 1.1 3.5 6.1 8.4 9.5 69 75 88 274 N/A
H5 DataURL Resize 4.2 6.5 12 16 24 59 105 185 245 N/A
H5 ObjectURL Resize 1 1 1 1.7 1.7 4.5 10.5 18 30 150

文件(图片)上传调研: HTML 5 vs. Flash

测试时依次预览100K、300K、500K、800K、1M、3M、5M和10M的图片,以及批量预览上述图片,而针对Flash以及ObjectURL with resize还进行了批量274个图片文件共计600M大小的预览测试。

从测试结果来看,HTML5 ObjectURL with resize方案最理想,尤其在批量上传时内存能够有效的回收;其次是Flash,但在批量上传时内存回收不明显,剩余其他几个方案内存消耗都比较大。

压缩

压缩测试是针对一张10M(5134*3456px)JPEG图片,按不同压缩质量压缩,比较压缩后的图片大小以及压缩所消耗的时间。

HTML5 ObjectURL

图片质量(%) 100 90 80 70 60 50
耗时(ms) 543 500 495 481 472 428
大小(KB) 2449 741 512 406 340 296

Flash

图片质量(%) 100 90 80 70 60 50
耗时(ms) 4768 3555 3295 3205 3243 3137
大小(KB) 2945 895 608 483 407 356

压缩耗时比较

文件(图片)上传调研: HTML 5 vs. Flash

compress_result1.png)

压缩大小比较

文件(图片)上传调研: HTML 5 vs. Flash

从测试数据来看,相同质量下,Flash压缩后的图片比HTML5的要大20%左右,而Flash压缩所消耗的时间则是HTML5的3.5倍。

评测总结

  • 兼容性:与HTML5相比,Flash兼容性在PC端全面占优,但是在移动端则正好相反;HTML5在IE10+、Chrome以及Firefox中均有较好的兼容性和稳定性;
  • 能力:Flash在文件上传方面的功能HTML5均能覆盖,包括多选、剪裁、压缩、预览、异步上传等,而且HTML5还能通过拖拽来选择文件,因此在这方面HTML5更具优势;
  • 性能:在图片预览和压缩两种操作中,无论是内存消耗还是时间消耗,HTML5的性能都优于Flash;此外,使用HTML5实现时需要载入的文件比Flash更小,在载入速度方面HTML5也占据优势;

结论

从评测数据来看,HTML5在可用的环境中各方面均优于Flash,因此对于Chrome、IE10+、Firefox、Safari等支持HTML5的环境中使用HTML5完整实现上传功能,而在不支持HTML5的环境中使用Flash。

此外,尽量不考虑在HTML4环境中使用JS来实现批量的文件上传功能,一方面需要考虑各种兼容性问题,这会给稳定性带来考验;另一方面,HTML4环境中如果需要实现图片预览将会遇到很多问题,很可能需要在JS版本中维护多套实现;总之,在HTML4中实现JS的批量上传是一件投入产出比很低的事情。


by 百度FEX

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
java RSA算法的性能记录
环境JavaHotSpot(TM)64BitServerVM1.7.0\_05x86\_64加密<table<tr<td内容长度</td<tdkeySize</td<td耗时(微秒)</td</tr<tr<td32</td<td512</td<td87</td</tr<tr<td
红烧土豆泥 红烧土豆泥
4年前
Java的数值数据类型以及命名规范
一、Java中的数值数据类型<table<tbody<tr<tdwidth"75"valign"top"style"wordbreak:breakall;"<spanstyle"backgroundcolor:rgb(255,254,213);"类型名<br</span</td<tdwidth"299
Stella981 Stella981
4年前
Jira 使用手册
<tablestyle"width:100%;margin:200px0300px0;"<tr<thDate</th<thRevisionversion</th<thDescription</th<thauthor</th</tr<tr<td20180614</td<tdV1.0.0</td
Stella981 Stella981
4年前
Bootstrap学习笔记
1.Table:table,tablebordered,table,tablehover,tablecondensed,2.tr,td:active,success,warning,danger,info3.Form:formgroupformcontrol,forminline,formhorizontal,4.
Wesley13 Wesley13
4年前
2020软件工程作业03
<styletable{width:100%;/\表格宽度\/margin:auto;/\外边距\/emptycells:show;/\单元格无内容依旧绘制边框\/fontsize:18px;}table,th,td{border:2pxsolidpink;}li{fontsize:1
Stella981 Stella981
4年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Wesley13 Wesley13
4年前
Java 日期与时间
Java的日期Java没有内置的日期类,但可以导入java.time包,这个包中包含了许多类,可用于处理日期和时间。例如:<table<tbody<tr<thstyle"width:25%"Java类</th<thstyle"width:75%"描述</th</tr<tr<td<code
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这