关于ajax无刷新上传和下载

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

关于上传

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

2、自己写XMLHttpRequest

// 准备FormData
var formData = new FormData();
formData.append('key',value); // 创建xhr对象
var xhr = new XMLHttpRequest();
// 监听状态,实时响应
// xhr 和 xhr.upload 都有progress事件,xhr.progress是下载进度,xhr.upload.progress是上传进度
xhr.upload.onprogress = function (event) {
if (event.lengthComputable) { var percent = Math.round(event.loaded / event.total); console.log('%d%', percent); }
};
// 传输开始事件
xhr.onloadstart = function (event) { console.log('load start'); };
// ajax过程成功完成事件
xhr.onload = function (event) {
console.log('load success');
console.log(xhr.responseText);
var ret = JSON.parse(xhr.responseText);
console.log(ret);
};
// ajax过程发生错误事件
xhr.onerror = function (event) { console.log('error'); };
// ajax被取消
xhr.onabort = function (event) { console.log('abort'); };
// loadend传输结束,不管成功失败都会被触发
xhr.onloadend = function (event) { console.log('load end'); };
// 发起ajax请求传送数据
xhr.open('POST', '/upload', true);
xhr.send(formData);

3、使用Jquery

var formData = new FormData();
formData.append('key',value);//传的参和值
$.ajax({
url: 'XXX' ,
type: 'POST',
data: formData,
contentType: false,
processData: false,
success: function (res) {
},
error: function () {
}
});

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

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

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

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

上传接口API:

成功返回:

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

失败返回:

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

HTML:

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

1、暴力一点的下载直接

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

优点:代码量少。

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

2、优雅一点的下载:

function download() {
var a = document.createElement('a');
var url = 'download/?filename=aaa.txt';
var filename = 'data.xlsx';
a.href=url;
a.download = filename;
a.click()
}

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

缺点:不支持post方式下载

3、使用XMLHttpRequest,BLOB方式

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

优点:支持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. Node.js快速创建一个Express应用的几个步骤

    Node.js 的 Express 框架学习 转载和参考地址: https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Express_N ...

  2. flask-url参数

    flask-url参数 无约束(string)传参 from flask import Flask app = Flask(__name__) @app.route('/<id>') de ...

  3. k8s集群搭建笔记(细节有解释哦)

    本文中所有带引号的命令,请手动输入引号,不知道为什么博客里输入引号,总是自动转换成了中文 基本组成 pod:k8s 最小单位,类似docker的容器(也许) 资源清单:资源.资源清单语法.pod生命周 ...

  4. Python Requests-学习笔记(3)-处理json

    JSON响应内容 Requests中也有一个内置的JSON解码器,助你处理JSON数据: r = requests.get('https://github.com/timeline.json') pr ...

  5. mysql 的CURDATE() 与 NOW() 的区别

    SELECT CURDATE() 查询出的是当前天的开始时间点,比如今天是 2015.02.03号,那不管我在今天什么时间点查询,结果都是今天的凌晨,即今天的开始的那个时间点,因为它只具体到年月日,没 ...

  6. Java 理论与实践: 流行的原子

    Java 理论与实践: 流行的原子 新原子类是 java.util.concurrent 的隐藏精华 在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待.无锁定的算法.在 ...

  7. AJ学IOS(07)UI之UITextField代理事件_类似QQ登陆窗口的简单实现

    AJ分享,必须精品 先看效果图: 学习代码 // // NYViewController.m // 05-UITextField事件_UIKit复习 // // Created by apple on ...

  8. 刮刮乐自定义view

    说明:该代码是参考鸿洋大神的刮刮乐自定义view来写的. 实现:刮刮乐-刮奖的效果,如下效果 下面直接放代码了:只有一个自定义view,要实现真正的功能还需要进一步封装 /** * 自定义view-刮 ...

  9. [总结]Floyd算法及其应用

    目录 一.Floyd算法 二.Floyd算法的应用 1. 传递闭包 例1:P2881 [USACO07MAR]排名的牛Ranking the Cows 例2:P2419 [USACO08JAN]牛大赛 ...

  10. C# windows服务没有RunInstallerAttribute.Yes的公共安装程序

    1.在视图状态 右键添加ServiceInstaller及ServiceProcessInstaller两个控件; 2.将serviceProcessInstaller类的Account属性改为 Lo ...