原生JavaScript实现异步多文件上传


Posted in Javascript onDecember 02, 2015

这是在上篇的修改版本。后台代码不变就可以接着使用,但是脚本不再使用jQuery了,改为原生的JavaScript 代码,所以我们主要看JS代码。

先介绍一下技术参数:

页面技术:HTML5

后台技术:Servlet 3.0

服务器:Tomcat 7.0

脚本:JavaScript

HTML5 file组件的新属性

accept : 如果在file组件中增加这个属性就可以直接控制上传的文件类型了,实在是很方便。

multiple:是否允许选择多个文件
HTML5 页面代码修改后

<img width="400" height="250"/><br />
<input type="file" id="pic" name="pic" onchange="printFileInfo()" accept="image/*" multiple="multiple"/>
<input type="button" value="上传图片" onclick="uploadFile()" /><br />
<div id="parent">
<div id="son"></div>
</div>

accept 的值可以参阅:IANA MIME 类型(标准 MIME 类型的完整列表),如果使用的是DW开发的话,软件本身就有提示。

如果选择了多个文件,可以用JS做循环打印,看看文件的名称,类型和大小,看演示代码

function printFileInfo(){
 
 var picFile = document.getElementById("pic"); 
 var files = picFile.files;
 for(var i=0; i<files.length; i++){
  var file = files[i];
  var div = document.createElement("div")
  div.innerHTML = "第("+ (i+1) +") 个文件的名字:"+ file.name +
  " , 文件类型:"+ file.type +" , 文件大小:"+ file.size 
  document.body.appendChild( div)
 }
}

既然可以循环多文件的话,就可以尝试多文件上传了。

1、首先创建 XMLHttpRequest 对象

//这是全局变量。因为是示例,所以就没有判断浏览器类型,低版本IE这么写的话会出问题的
var xhr = new XMLHttpRequest()
2、上篇介绍了进度事件(Progress) , 这次实现 progress 和 error 2个事件

error:在请求发生错误时触发。

 对应上传时发生错误导致的上传失败:uploadFailed()

//上传失败
function uploadFailed(evt) {
 alert("上传失败");
}
progress:在接收相应期间持续不断触发。




对应上传进度方法:onprogress()
/**
 * 侦查附件上传情况 ,这个方法大概0.05-0.1秒执行一次
 */
function onprogress(evt){
 var loaded = evt.loaded;       //已经上传大小情况 
 var tot = evt.total;       //附件总大小 
 var per = Math.floor(100*loaded/tot);   //已经上传的百分比 
  $("#son").html( per +"%" );
 $("#son").css("width" , per +"%");
}

最后就是上传方法了,注意上面的html代码中上传用的方法也需要改成这个uploadFile()方法才能正常使用。

//上传文件
function uploadFile() {
//将上传的多个文件放入formData中
 var picFileList = $("#pic").get(0).files;
 var formData = new FormData();
 for(var i=0; i< picFileList.length; i++){
  formData.append("file" , picFileList[i] );
 }

 //监听事件
 xhr.upload.addEventListener("progress", onprogress, false);
 xhr.addEventListener("error", uploadFailed, false);//发送文件和表单自定义参数
 xhr.open("POST", "upload");
 //记得加入上传数据formData

 xhr.send(formData);
}

PS: 这毕竟只是基本功能的演示示例,离公司使用的要求还相差十万八千里,请谨慎在公司平台使用。

大家可以结合这篇文章进行学习:基于HTML5 Ajax文件上传进度条如何实现(jquery版本)

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
js的闭包的一个示例说明
Nov 18 Javascript
jquery text()要注意啦
Oct 30 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
BootStrap创建响应式导航条实例代码
May 31 Javascript
BootstrapTable refresh 方法使用实例简单介绍
Feb 20 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
Aug 25 Javascript
vue在响应头response中获取自定义headers操作
Jul 24 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
Oct 21 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
Dec 02 #Javascript
日常收藏的jquery技巧
Dec 02 #Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 #Javascript
jquery密码强度校验
Dec 02 #Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
Dec 01 #Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 #Javascript
js实现继承的5种方式
Dec 01 #Javascript
You might like
php array的学习笔记
2012/05/10 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
简明json介绍
2008/09/28 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python实现自动登录后台管理系统
2018/10/18 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
岗位职责风险防控
2014/02/18 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
2014年检验员工作总结
2014/11/19 职场文书
通知函的格式
2015/04/27 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书