• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 一文讲解ajax实现无刷新上传和下载(代码详解)

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了ajax上传,无刷新上传和下载等相关知识,希望对您有所帮助

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


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


关于ajax无刷新上传和下载

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

关于上传

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

自己写XMLHttpRequest

// 准备FormDatavar 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);


使用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>

关于下载:

暴力一点的下载直接

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

优点:代码量少。

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

优雅一点的下载:

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


使用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低版本浏览器


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ThinkPHP5通过ajax插入图片并实时显示(完整代码)
  • 一文讲解ajax实现无刷新上传和下载(代码详解)

相关文章

  • 2022-04-29Photoshop技巧:CC版本的最全总结
  • 2022-04-29Javascript怎样验证手机号码
  • 2022-04-29帝国CMS常用的过滤特殊字符及空格函数
  • 2022-04-29WordPress常见故障有哪些?怎么处理?
  • 2022-04-29Photoshop制作3D小人推动切割的艺术字教程
  • 2022-04-29Nginx环境下PHP安全设置
  • 2022-04-29忘记mysql密码了怎么办
  • 2022-04-29Discuz后台计划任务不运行解决方法
  • 2022-04-29Photoshop设计3D效果的月牙状LOGO
  • 2022-04-29Photoshop使用图层样式制作金属立体字

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • DEDE内容页调用栏目的SEO标题、描述、关键字的方
    • ThinkPHP5分页paginate代码实例解析
    • Photoshop制作颓废的彩色立体字
    • 在 MySQL 中 int (10) 和 int (11) 的区别
    • 聊聊Bootstrap4中的网格系统
    • PHPCMS V9 文章列表循环样式自定义方法
    • Thinkphp极验滑动验证码实现步骤解析
    • 判断是否为jquery对象使用什么运算符
    • 手把手教你用PHP完成一个分布式事务TCC
    • 苹果cms播放器无法全屏修复方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有