原生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获取html文件的思路及示例
Sep 17 Javascript
用js来获取上传的文件名纯粹是为了美化而用
Oct 23 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python输出带颜色的字符串实例
2017/10/10 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
python如何实现word批量转HTML
2020/09/30 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
小学生学习感言
2014/03/10 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
体育节口号
2014/06/19 职场文书
2014年工程师工作总结
2014/11/25 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书