原生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 相关文章推荐
ECMAScript中函数function类型
Jun 03 Javascript
js实现跨域的多种方法
Dec 25 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
easyui messager alert 三秒后自动关闭提示的实例
Nov 07 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
解决vue 打包发布去#和页面空白的问题
Sep 04 Javascript
node实现分片下载的示例代码
Oct 17 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
Apr 17 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
菜鸟修复电子管记
2021/03/02 无线电
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
iframe调用父页面函数示例详解
2014/07/17 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
python实现简单的TCP代理服务器
2014/10/08 Python
python分析apache访问日志脚本分享
2015/02/26 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
django框架cookie和session用法实例详解
2019/12/10 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python运行DLL文件的方法
2020/01/17 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
工作人员思想汇报
2014/01/09 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
《火烧云》教学反思
2014/04/12 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
美食节目策划方案
2014/05/31 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS