实例讲解javascript实现异步图片上传方法


Posted in Javascript onDecember 05, 2017

我们首先看下HTML代码实现的form提交部分。其中大家在测试的时候需要把test的URL更换成自己的,也可以直接写一个本地地址测试。

html代码:

<form id="uploadForm" action="http://storage.test.com/file/upload" method="post" enctype="multipart/form-data">
  <input type="hidden" name="key" id="key" value="VTZ18HM64#D_L3WX" />
  <input type="file" name="uploadFiles" value="" id="fileImage" multiple='multiple' />
  <div class="upload_submit">
  <button type="button" id="fileSubmit" class="upload_btn">保存</button>
  </div>
</form>

js代码:

var Fileupload = {
  fileInput: $("#fileImage").get(0),
  dragDrop: $("#fileDragArea").get(0),
  upButton: $("#fileSubmit").get(0),
  url: $("#uploadForm").attr("action"),
  })(),
  //文件上传
  funUploadFile: function() {
   var self = this;
   for (var i = 0, file; file = this.fileFilter[i]; i++) {
    (function(file) {
     var xhr = new XMLHttpRequest();
     if (xhr.upload) {
      // 上传中
      xhr.upload.addEventListener("progress", function(e) {
       self.onProgress(file, e.loaded, e.total);
      }, false);
      // 文件上传成功或是失败
      xhr.onreadystatechange = function(e) {

      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
         self.onSuccess(JSON.parse(xhr.responseText));
         self.funDeleteFile(file);
         if (!self.fileFilter.length) {
          //全部完毕
          self.onComplete();
         }
        } else {
         self.onFailure(file, xhr.responseText);
        }
       }
      };
      //准备FormData对象
      var myForm = document.getElementById('uploadForm');
      //将文件放入FormData对象中
      formData = new FormData(myForm);

      // 开始上传
      xhr.open("POST", self.url, true);
      xhr.send(formData);
     }
    })(file);
   }
  },
  init: function() {
   var self = this;
   //上传按钮提交
   if (this.upButton) {
    console.log('提示: 当前存储服务器地址', this.url)
    this.upButton.addEventListener("click", function(e) {
     self.funUploadFile(e);
    }, false);
   }
   self.bindEvent();
  }
 };
 Fileupload = $.extend(Fileupload);
 Fileupload.init();

FormData 异步上传文件

<input type="file" id="file">

一、创建FormData放入待上传文件

//准备FormData对象
var formData = new FormData(),
 uploadFile = document.getElementById('file');
 
//将文件放入FormData对象中 
formData.append('file', uploadFile.files[0]);

二、通过xhr发送FormData数据到服务器,实现文件上传

//创建xhr对象
var xhr = new XMLHttpRequest();

//监听文件上传进度
xhr.upload.onprogress = function(evt){
 //lengthComputabel: 文件长度是否可计算
 if(evt.lengthComputable){
  //evt.loaded: 已下载的字节数
  //evt.total: 文件总字节数
  var percent = Math.round(evt.loaded*100/evt.total);
  console.log(percent);
 }
}

//监听文件传输开始 
xhr.onloadstart = function(evt){
  xhr.abort() //终止上传
}

//监听ajax成功完成事件
xhr.onload = function(evt){
 ...
}

//监听ajax错误事件 
xhr.onerror = function(evt){
 ...
}

//监听ajax被中止事件
xhr.onabort = function(evt){
 ...
}

//监听传输结束事件: 不管成功或者失败都会触发
xhr.onloaded = function(evt){
 ...
}
 
//*发起ajax请求数据
xhr.open('POST', '/url', true);
xhr.send(formData);
Javascript 相关文章推荐
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
JavaScript程序设计之JS调试
Dec 09 Javascript
JavaScript基础知识及常用方法总结
Jan 10 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
JavaScript判断变量名是否存在数组中的实例
Dec 28 Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
JavaScript的function函数详细介绍
Nov 20 Javascript
jquery如何实现点击空白处隐藏元素
Dec 05 #jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 #jQuery
最实用的JS数组函数整理
Dec 05 #Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
Dec 05 #Javascript
Vue DevTools调试工具的使用
Dec 05 #Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 #Javascript
webpack学习教程之前端性能优化总结
Dec 05 #Javascript
You might like
php curl 伪造IP来源的实例代码
2012/11/01 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
js常用函数 不错
2006/09/08 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
Vue.js用法详解
2017/11/13 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
Python中的流程控制详解
2021/02/18 Python
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
自荐信怎么写好
2013/11/11 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
葬礼司仪主持词
2014/03/31 职场文书
企业环保标语
2014/06/10 职场文书
公司离职证明标准格式
2014/11/18 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
大足石刻导游词
2015/02/02 职场文书
银行优秀员工推荐信
2015/03/24 职场文书