一文讲解ajax实现无刷新上传和下载(代码详解)

 4204

本篇文章给大家了解ajax实现无刷新上传和下载,有需要的朋友可以参考一下,希望对你们有所助。


一文讲解ajax实现无刷新上传和下载(代码详解)


关于ajax无刷新上传和下载

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

关于上传

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

自己写XMLHttpRequest

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


使用Jquery

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

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

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

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

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

上传接口API: 成功返回:

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

失败返回:

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

HTML:

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

关于下载:

暴力一点的下载直接

  1. window.open("/rest/donwload/abcd.do");

优点:代码量少。

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

优雅一点的下载:

  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方式下载


使用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.zztuku.com/index.php/detail-9100.html
站长图库 - 一文讲解ajax实现无刷新上传和下载(代码详解)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐