实例讲解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 相关文章推荐
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
jquery radio 操作代码
Mar 16 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
jquery eval解析JSON中的注意点介绍
Aug 23 Javascript
点击button获取text内容并改变样式的js实现
Sep 09 Javascript
原生js实现可拖动的登录框效果
Jan 21 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
详解React中的组件通信问题
Jul 31 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
如何提升vue.js中大型数据的性能
Jun 21 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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中使用session防止用户非法登录后台的方法
2015/01/27 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
Vue中render方法的使用详解
2018/01/26 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
python调用fortran模块
2016/04/08 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python多线程扫描端口代码示例
2018/02/09 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
销售总经理岗位职责
2014/03/15 职场文书
小学六年级学生评语
2014/04/22 职场文书
校园活动策划方案
2014/06/13 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS