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

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

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了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实现无刷新上传和下载(代码详解)

相关文章

  • 三种ThinkPHP6中获取参数的方法
  • 去除织梦CMS后台头部多的一行空白
  • Photoshop制作立体效果的图案艺术字
  • 谈谈PHP运算符“::”、“->”和“=>”的区别
  • PhotoShop制作简单的桔子果肉文字效果新手教程
  • PHP如何设定启用php缩写(php.ini、short_open_tag)
  • Photoshop设计复古风格的行星海报教程
  • 小程序学习之浅析image标签、swiper组件
  • PHP处理字符中的emoji表情(判断/移除/存储)
  • Vue 手势组件教程

文章分类

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

最近更新的内容

    • 帝国cms防止恶意注册 会员空间发布违规违禁信息
    • 微信小程序中如何实现子向父传参(页面通信)
    • Photoshop设计颗粒质感艺术字教程
    • wordpress怎么添加自定义按钮并导出csv
    • 最新PTCMS 14个采集规则
    • 一分钟解决mysql_config not found的问题
    • 分享几种用PHP写99乘法表的方式
    • 浅析什么是装饰器?Vue中怎么使用装饰器?
    • 利用AI+PS制作假日热销3D文字特效教程
    • PHP保存数组到数据库

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

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