长期以来,开发者们一直为此苦恼,大部分为解决这个问题都采用了flash作为解决方案,但flash并非灵丹妙药,因为flash版本,割据造成的问题有时反倒成为了噩梦。有些网站则采用了form标签的enctype=multipart/form-data属性,但这一属性要求服务器作出特殊的设置才能够显示进度,而且本身也比较复杂,复杂就意味着容易出现错误,这可不是我们想要的。
现在我们来看看Html5为什么能够解决这个问题,以及,它到底能做的多好。
用HTML5上传文件
在HTML5标准中,XMLHttpRequest对象被重新定义,被称为“”,其中包含了以下5个新特性:
1、支持上传、下载字节流,比如文件、blob以及表单数据
2、增加了上传、下载中的进度事件
3、跨域请求的支持
4、允许发送匿名请求(即不发送HTTP的Referer部分)
5、允许设置请求的超时
在这篇教程中,我们主要关注第一和第二项特性,尤其是第二项——它能够提供我们想要的上传进度。和之前的方案不同,这个方案并不要求服务器作出特殊的设置,因此大家边看教程就可以边动手试试了。
上面图示的就是我们能够实现的内容:
1、显示上传的文件信息,比如文件名、类型、尺寸
2、一个能够显示真实进度的进度条
3、上传的速度
4、剩余时间的估算
5、已上传的数据量
6、上传结束后服务器返回的响应
另外,凭借XMLHttpRequest,我们的上传过程整个都是异步的,因此用户在上传文件的时候,依然可以操作网页当中的其它元素,并不需要专门等待上传的完成。而在上传结束后,我们能够获取服务器发回的响应,因此整个上传过程都显得相当顺理成章。
HTML5的进度事件
HTML5当中新增了一个进度事件(),这个事件为我们提供了以下信息:
1、total – 文件大小
2、loaded – 已上传的大小
3、lengthComputable – 进度是否可计算
信息并不多,但是在计算文件进度上已经足够了。当然,也还有很多东西它没有直接给出,这非常遗憾。