实例讲解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 利用Cookie记录用户登录信息
Dec 08 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
带左右箭头图片轮播的JS代码
Dec 18 Javascript
html5+javascript制作简易画板附图
Apr 25 Javascript
简述jQuery ajax的执行顺序
Jan 05 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 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实现模仿socket请求返回页面的方法
2014/11/04 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
js实现简单音乐播放器
2020/06/30 Javascript
简明 Python 基础学习教程
2007/02/08 Python
Python获取远程文件大小的函数代码分享
2014/05/13 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
python 统计代码行数简单实例
2017/05/04 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
计算机专业学生求职信分享
2013/12/15 职场文书
新书发布会策划方案
2014/06/09 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
个人年终总结结尾
2015/03/06 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
Nebula Graph解决风控业务实践
2022/03/31 MySQL
vue动态绑定style样式
2022/04/20 Vue.js
Mysql数据库group by原理详解
2022/07/07 MySQL