关于ajax无刷新上传和下载

这是一个没什么含量但是又用的比较多又不得不说的问题,其实真的不想说,因为没什么好说的。

关于上传

1、使用Flash,ActiveX 上传 ,略...

2、自己写XMLHttpRequest

  1. // 准备FormData
  2. var formData = new FormData();
  3. formData.append('key',value);
  4. // 创建xhr对象
  5. var xhr = new XMLHttpRequest();
  6. // 监听状态,实时响应
  7. // xhr 和 xhr.upload 都有progress事件,xhr.progress是下载进度,xhr.upload.progress是上传进度
  8. xhr.upload.onprogress = function (event) {
  9. if (event.lengthComputable) { var percent = Math.round(event.loaded / event.total); console.log('%d%', percent); }
  10. };
  11. // 传输开始事件
  12. xhr.onloadstart = function (event) { console.log('load start'); };
  13. // ajax过程成功完成事件
  14. xhr.onload = function (event) {
  15. console.log('load success');
  16. console.log(xhr.responseText);
  17. var ret = JSON.parse(xhr.responseText);
  18. console.log(ret);
  19. };
  20. // ajax过程发生错误事件
  21. xhr.onerror = function (event) { console.log('error'); };
  22. // ajax被取消
  23. xhr.onabort = function (event) { console.log('abort'); };
  24. // loadend传输结束,不管成功失败都会被触发
  25. xhr.onloadend = function (event) { console.log('load end'); };
  26. // 发起ajax请求传送数据
  27. xhr.open('POST', '/upload', true);
  28. xhr.send(formData);

3、使用Jquery

  1. var formData = new FormData();
  2. formData.append('key',value);//传的参和值
  3. $.ajax({
  4. url: 'XXX' ,
  5. type: 'POST',
  6. data: formData,
  7. contentType: false,
  8. processData: false,
  9. success: function (res) {
  10. },
  11. error: function () {
  12. }
  13. });

这里要说的就是formData ,这个狗屎在IE10之后才开始完整的支持,IE9 吖的是个半残品。所以这要说的是第三种结合 form和iframe 来实现,原理:

隐藏的form 和iframe ,form的target指向iframe,监听iframe load,来获取上传结果。

优点:兼容该死的ie低版本浏览器

缺点:跨域上传不支持,还需自定义反向代理,因为iframe onload不支持跨域

上传接口API:

成功返回:

  1. {code: 1 ,msg:'上传成功'}

失败返回:

  1. {code:0,msg:'上传失败'}

HTML:

  1. <form action="xxxx" target="upload" enctype="multipart/form-data" method="post" style="display:none;">
  2. .....
  3. </form>
  4. <iframe name="upload" id="upload"></iframe>
  5. //JS:
  6. <script>
  7. var fm = document.getElementById('upload')
  8. var load = function(){
  9. var doc = fm.contentWindow || fm.contentDocument;
  10. if (doc.document) doc = doc.document;
  11. var content = doc.body.textContent; //此处的值取决与API 接口返回的值
  12. var data = JSON.parse(content);
  13. console.log(content)
  14. }
  15. // 兼容低版本浏览器监听判断
  16. fm.attachEvent ? fm.attachEvent('onload', load) : fm.onload= load;
  17. </script>
关于下载:

1、暴力一点的下载直接

  1. window.open('/rest/donwload/abcd.do')

优点:代码量少。

缺点:现代浏览器会自动识别文件类型,如pdf,会自动在浏览器打开

2、优雅一点的下载:

  1. function download() {
  2. var a = document.createElement('a');
  3. var url = 'download/?filename=aaa.txt';
  4. var filename = 'data.xlsx';
  5. a.href=url;
  6. a.download = filename;
  7. a.click()
  8. }

优点:解决了暴力下载自动打开文件的缺陷

缺点:不支持post方式下载

3、使用XMLHttpRequest,BLOB方式

  1. function download() {
  2. var url = 'download/?filename=aaa.txt';
  3. var xhr = new XMLHttpRequest();
  4. xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
  5. xhr.responseType = "blob"; // 返回类型blob
  6. // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
  7. xhr.onload = function () {
  8. // 请求完成
  9. if (this.status === 200) {
  10. // 返回200
  11. var blob = this.response;
  12. var reader = new FileReader();
  13. reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
  14. reader.onload = function (e) {
  15. // 转换完成,创建一个a标签用于下载
  16. var a = document.createElement('a');
  17. a.download = 'data.xlsx';
  18. a.href = e.target.result;
  19. $("body").append(a); // 修复firefox中无法触发click
  20. a.click();
  21. $(a).remove();
  22. }
  23. }
  24. };
  25. // 发送ajax请求
  26. xhr.send()
  27. }

优点:支持post方式

缺点:还是该死的兼容性问题

所以处理兼容性最好的方式 还是form结合iframe(不考虑兼容性当然还是XMLHttpRequest最好) ,这种方式不论是上传和下载 都是完美支持的。上传下载通用。

最好的上传下载方式: 你们的Boss 不要求兼容ie低版本浏览器

[完]

转载于:https://www.cnblogs.com/chuchur/p/9399541.html

ajax无刷新上传和下载的更多相关文章

  1. 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

    现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片 ...

  2. ajaxfileupload.js插件结合一般处理文件实现Ajax无刷新上传

    先上几张图更直观展示一下要实现的功能.本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2 ...

  3. ajax 无刷新上传

    最近要做微信的图文上传,因为一个图文了表中可以有多个图文,所有按钮需要随时添加,所以做了一种无刷新上传的方法. 首先我们要在html页面中写上这样的几段代码 javascript: $(functio ...

  4. Ajax 无刷新上传文件插件 uploadify 的使用

    在表单中无法直接使用 Ajax 上传文件,解决的思路可以是使用插件无刷新地上传文件,返回文件上传后的地址,然后把该地址作为 Ajax 的参数传递给服务器端进行数据库处理.可以使用 uploadify ...

  5. ajax无刷新上传

    我们在使用上传控件的时候,会遇到刷新的问题,最近使用ajax做的上传,觉得效果还是很不错. 首先,我们需要在页面上放上上传控件:需要注意的是,我们必须放在form里面,实现表单上传.  <for ...

  6. ajax无刷新上传文件

    网页上传文件最简单的方式就是通过表单上传了,但是在提交表单的时候会导致网页刷新,但有的时候我们不想网页刷新,有什么办法呢,我们可以使用ajax上传文件来做到这一点.只有ajax还不行,还需要JavaS ...

  7. jquery 的ajax无刷新上传文件之后,页面还是会莫名的刷新-----解决办法

    文件上传用到全局数组: $_FILES 只需要把下面的 <button onclick="post()">提交</button> 改为 <input ...

  8. jQuery.form Ajax无刷新上传错误 (jQuery.handleError is not a function) 解决方案

    今天,随着ajaxfileupload时间firebug财报显示,"jQuery.handleError is not a function"错误.因为一旦使用jQuery.for ...

  9. jquery ajax 无刷新上传

    var form = new FormData(); form.append('file', $("#submitmaterials").find("input" ...

随机推荐

  1. Redis操作,数据库操作

    Redis操作,数据库操作 案例1:源码安装Redis缓存服务 案例2:常用Redis数据库操作指令 案例3:配置Redis主从服务器 1 案例1:源码安装Redis缓存服务 1.1 问题 本案例要求 ...

  2. mappedBy和JoinColumn,onetomany。

    无论是onetomany,还是manytoone.都要设置级联关系(cascade),否则不会储存关联的数据. @Entity public class Clazzss { @Id @Generate ...

  3. 接口自动化测试之-requests模块详解

    一.requests背景 Requests 继承了urllib2的所有特性.Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国 ...

  4. Docker命名空间

    命名空间 命名空间( namespace )是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便利,利用这 特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系 ...

  5. not found 什么时候触发

    eq: BEGIN        DECLARE EXIT HANDLER FOR NOT FOUND SET o_state = 999;         select count(1) into ...

  6. 【python实现卷积神经网络】定义训练和测试过程

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  7. 跨域cookies 共享

    这是由于,本地调试.涉及到cookies的问题 想要跨域使用的问题 vue 中的mian.js中放入下面代码 import axios from 'axios' axios.defaults.with ...

  8. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  9. D. Ehab the Xorcist

    题意: 略: 感觉被演了一波,这是CFdiv2吗? 算是这个构造题吧. 1 首先我们可以将u进行二进制拆分来考虑.加入u>v那么小与v的那些数在怎么拼接也无法使异或值为u. 比如二进制U=1 0 ...

  10. Cucumber(1) —— 环境配置

    目录 学习资料 cucumber简介 cucumber环境配置 学习资料 1.cucumber官方学习网站 cucumber简介 1.cucumber是一种支持BBD(behavior-driven ...