HTML5关于上传API的一些使用(中)
上一次写了关于HTML的上传API,XMLHttpRequest2.0的上传方式,以及HTML5中上传之前本地的预览,包括对于图片以及部分信息的预
览。这次我们就讲下HTML5中关于上传的一些各种个性化需求的处理,主要包括实时进度条,上传速度的实时显示等。
关于上传事件
首先要做到实时进度条这种需求,首先我们需要得到关于上传的各种事件,这些事件大部分都是在XMLHttpRequest这个对象下面:
- progress事件:上传进度事件。
- load事件:传输成功完成。
- abort事件:传输被用户取消。
- error事件:传输中出现错误。
- loadstart事件:传输开始。
- loadEnd事件:传输结束,但是不知道成功还是失败。
其中progress事件分为上传和下载两种情况,上传的时候progress事件实际上是在XMLHttpRequest.upload对象下面,而下载的时候属于XMLHttpRequest对象
关于实时进度条
我们可以在上篇中的方法基础上进行扩展来写实时进度条的方法,
var xhr=new XMLHttpRequest();
var formData=new FormData();
formData.append('name',"Jack");
formData.append('uid',666666);
xhr.open("post",url);
xhr.send(formData);
//上传中
xhr.upload.addEventListener("progress", uploadProgress, false);
//上传成功
xhr.addEventListener("load", uploadComplete, false);
//上传出错
xhr.addEventListener("error", uploadFailed, false);
//上传取消
xhr.addEventListener("abort", uploadCanceled, false);
而上传事件还给我们提供了下面这些数据
- total – 文件大小
- loaded – 已上传的大小
- lengthComputable – 进度是否可计算
通过上面这些事件以及属性就可以很轻易的写出进度条。
function uploadProgress(evt){ //evt 上传事件中返回的数据
if (evt.lengthComputable) { //判断进度是否可以计算
var percentComplete = Math.round(evt.loaded * 100 / evt.total); //对进度进行计算并且格式化
document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; //输出100%
}else {
document.getElementById('progressNumber').innerHTML = 'unable to compute';
}
}
上面这个方法是直接在某个div中直接显示百分比的数字,假如我们需要做进度条也很简单,可以添加一个标签,默认宽度为0,然后在uploadProgress方法中动态更改标签的宽度,单位为百分比,而值就是percentComplete,这样可以在上传的过程当中得到一个完整的进度条。
而当我们文件上传完毕之后可以在load事件中绑定的uploadComplete方法中去做一些css等UI的修改。
关于实时上传速度的显示
现在进度条有了,可是我们还想知道速度是多少应该怎么办呢。
可以通过计算的方法获取其上传的速度,我们在progress事件中是知道已上传的文件大小的,那我们在uploadProgress方法中没过1秒都去计算一下这一次和上一次的loaded大小就可以知道其每秒的上传速度。从而在页面上实时的更新当前的上传速度了。
代码如下
// currentLoadedBytesb本次上传的数据总量,
// lastLoadedBytes 上一次上传的数据总量
// oldObjUploadBits旧的上传速度
var currentLoadedBytes,lastLoadedBytes,oldObjUploadBits;
timer = setInterval(
function () {
var bytesCount = currentLoadedBytes - lastLoadedBytes;
if (bytesCount !== 0) {
var speed = ConvertBytesUnit(bytesCount);
$(obj).html("上传速度:" + speed.number + speed.unit + "/s");
} else {
$(obj).html(oldObjUploadBits);
}
oldObjUploadBits = $(obj).html();
lastLoadedBytes = currentLoadedBytes;
}
, 1000) function ConvertBytesUnit(size){
if (size < 0) size = 0;
var result = {};
if (size > 1024 * 1024) {
result.number = (size / (1024 * 1024)).toFixed(2);
result.unit = "MB";
} else if (size > 1024 ) {
result.number = (size / 1024).toFixed(2);
result.unit = "KB";
} else {
result.number = size.toFixed(2);
result.unit = "B";
}
return (result);
}
通过上面的方法就可以获得每一秒具体的上传速度了。
另外XMLHttpRequest2.0可以实现的功能其实很多,另外还可以实现断点续传,以及分片上传等更高级的功能。我们留在下一篇再来说。
HTML5关于上传API的一些使用(中)的更多相关文章
- HTML5关于上传API的一些使用(上)
HTML5提供了很多有用的API,其中就包括上传的API,XMLHttpRequest2.0,在HTML5时代之前,需要进行二进制的上传一般都会才用flash的方案,但是当XMLHttpRequest ...
- AJAX文件上传实践与分析,带HTML5文件上传API。
对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的. 网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可 ...
- HTML5关于上传API的一些使用(下)
通过前面两篇的分享,我们已经搞定了单个文件的普通的上传,包括文件预览,图片预览,上传速度等前端界面的显示,这次我们来谈谈关于>XMLHttpRequest2.0在界面之后假如才用分片上传能做到一 ...
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...
- HTML5文件上传还有进度条
以下是自学it网--中级班上课笔记 网址:www.zixue.it 需要在chrome,ff,IE10下运行 html页面 <!DOCTYPE html> <html lang=&q ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- 【Demo】HTML5 拍照上传
本文主要讲解 手机浏览器 如何拍照 为什么会有这个需求 最近做一个项目要用到拍照然后上传照片,但是网页拍照一般都是用Flash做的,而我们主要是H5页面,如果在微信里面有权限就可以通过JSSDK调起摄 ...
- html5文件上传
<!DOCTYPE html><html><head> <title>Html5 Ajax 上传文件</title></head> ...
- HTML5 图片上传预览
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
随机推荐
- C#基础视频教程3.1 常见控件类型和使用方法
可以从左侧的工具箱中找到常见的控件(你要在Form1这种窗体上) 为了方便你也可以把工具箱整个拖过去,这样从上到下控件都给你排好了 对于按钮来说,最常见的就是他的背景颜色,文字,字体,还有是否 ...
- Linux中setup命令command not found如何解决?
1.安装setuptool yum -y install setuptool 2.系统服务管理 yum -y install ntsysv 3.setup中配套的防火墙设置也得装上去,不然会出 ...
- javascript:void(0)和onclick=fn(this)
今天在写代码中遇到一个这样的问题.关于点击在html中添加点击事件,顺便把this对象通过参数传过去. <a href='#' \>查看详情</a> <a href='j ...
- 怎样获取oracle dbid
1.查询v$database获得 因为DBID在控制文件和数据文件里都存在记录,所以假设可以mount数据库就行查询v$database视图获得. SQL> alter database mo ...
- AFNetworking2.0源代码解析
写在前面给大家推荐一个不错的站点 点击打开链接 本文測试样例源代码下载地址 近期看AFNetworking2的源代码.学习这个知名网络框架的实现.顺便梳理写下文章. AFNetworking的代码还在 ...
- HTML-IE6复制BUG
在IE6下使用浮动可能会出现文字重复的情况. 在IE6下,浮动层之间有注释文字的话,之前那个浮动层的内容文字就有可能遭遇一个“隐形”的复制,但是代码里查看文字可并没有多出来. 看个例子: XML/HT ...
- js 多选选择删除数据
按了顶上的删除(多项删除) 单列复选框删除 js语句 <a href="javascript:delOne('${customer.id}')">删除</a> ...
- IntelliJ Idea各种技巧设置笔记和错误解决
版本控制 GitHub GitHub提示找不到路径: 解决方法:去官方下载gitHub,然后在以下路径找到Git.exe并设置 C:\Users\你的用户\AppData\Local\GitHub\P ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- Linux系统里如何彻底的清空终端屏幕?
Linux用户,特别是Ubuntu或CentOS用户,基本上都习惯使用clear命令或Ctrl+L组合快捷键来清空终端屏幕.但是,这样做其实并不是真正的清空屏幕,它只是给人一种错觉,让人以为屏幕清空了 ...