实例讲解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 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
js 鼠标点击事件及其它捕获
Jun 04 Javascript
jquery中的sortable排序之后的保存状态的解决方法
Jan 28 Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
Oct 17 Javascript
AngularJS控制器继承自另一控制器
May 09 Javascript
JavaScript实现in-place思想的快速排序方法
Aug 07 Javascript
微信小程序使用第三方库Immutable.js实例详解
Sep 27 Javascript
Vuex 入门教程
Jan 10 Javascript
微信小程序实现图片预览功能
Jan 31 Javascript
vue template中slot-scope/scope的使用方法
Sep 06 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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
wamp安装后自定义配置的方法
2014/08/23 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
JqGrid web打印实现代码
2011/05/31 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python创建xml的方法
2015/03/10 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
详解如何修改python中字典的键和值
2020/09/29 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
任课老师推荐信范文
2013/11/24 职场文书
银行办理业务介绍信
2014/01/18 职场文书
学习决心书
2014/03/11 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
教师党员个人自我评价
2015/03/04 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL