原生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 相关文章推荐
两个SUBMIT按钮,如何区分处理
Aug 22 Javascript
jquery 滚动条事件简单实例
Jul 12 Javascript
javascript实现回到顶部特效
May 06 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
JS实现简易留言板特效
Dec 23 Javascript
vue-cli设置publicPath小记
Apr 14 Javascript
深入分析jQuery.one() 函数
Jun 03 jQuery
element中table高度自适应的实现
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
ThinkPHP写第一个模块应用
2012/02/20 PHP
php 文件上传实例代码
2012/04/19 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
php数据访问之增删改查操作
2016/05/09 PHP
PHP模块化安装教程
2016/06/01 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
C语言编程练习
2012/04/02 面试题
经典c++面试题六
2012/01/18 面试题
工程造价专业大学生职业规划范文
2014/03/09 职场文书
安全生产活动月方案
2014/03/09 职场文书
计算机求职信
2014/07/02 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
个人租房协议书样本
2014/10/01 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL