php后端通过ajax接口返回二进制数据流,让前端下载excel文件(ajax传递json参数)

在这里插入图片描述

   //导出数据
    function exportUser() {
        var url = '?m=User&a=userDeal&act=exportUser';
        var data = JSON.stringify({
            'user_province':$('#province').val(),
            'user_city': $('#city').val(),
            'user_area': $('#area').val(),
            'user_depart': $('#user_depart').val(),
            'user_offices': $('#user_offices').val(),
            'user_auth': $('#user_auth').val(),
            'smallMajor': $('#smallMajor').val(),
            'threeMajor': $('#threeMajor').val(),
            'user_title': $('#user_title').val(),
            'user_name': $('#user_name').val(),
            'user_eid': $('#user_eid').val(),
            'member_type': $('#member_type').val(),
            'user_phone': $('#user_phone').val()
        });
        //console.log(data);
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        // 设置请求头,告知服务器请求体的内容类型
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.responseType = "blob";    // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
  /*      xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 200) {
                // 请求完成且成功,处理响应
                console.log(xhr.responseText); // 打印服务器返回的数据
            }
        };*/
       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) {
                    console.log(e);
                    var a = document.createElement('a');
                    a.download = 'data.xls';
                    a.href = e.target.result;
                    $("body").append(a);    // 修复firefox中无法触发click
                    a.click();
                    $(a).remove();
                }
            }
        };
        xhr.send(data);// 发送ajax请求
    }

在上面的POST请求示例中,使用JSON.stringify()方法将JavaScript对象转换为JSON格式的字符串,然后设置Content-Type请求头为application/json,最后调用xhr.send(jsonData)发送数据。

注意事项

  • 异步请求(第三个参数为true)是默认的,也是通常推荐的方式,因为它不会阻塞浏览器的UI线程。
  • 当使用XMLHttpRequest时,请确保处理各种可能的错误情况,例如网络错误、服务器错误等。
  • 现代的前端开发中,fetch API通常被视为更现代、更简洁的方式来发送HTTP请求,它基于Promises,提供了更好的错误处理和更强大的功能。然而,XMLHttpRequest在一些旧版浏览器或特定场景中仍然有用。
  • 在处理服务器响应时,请注意检查状态码(xhr.status)和响应类型(xhr.responseText 或xhr.response,取决于响应类型)。如果服务器返回的是JSON数据,你可能需要使用JSON.parse()来解析响应文本。

后端处理

当从前端通过XMLHttpRequest(XHR)的xhr.send(data)方法发送数据到PHP后端时,PHP可以通过 P O S T 或 _POST或 POST_REQUEST(或file_get_contents(‘php://input’),对于非表单编码的数据)来访问这些数据。

然而,如果是通过xhr.setRequestHeader(‘Content-Type’, ‘application/json’)设置了请求头,并使用JSON.stringify(data)将数据转换为JSON字符串发送,那么默认情况下PHP不会将JSON字符串解析到$_POST数组中。

为了获取JSON数据,您需要在PHP后端中读取原始输入流(php://input),并使用json_decode()函数将其解析为PHP对象或数组。

//导出用户信息
    case "exportUser";
        require_once "libs/user.export.php";
        $data = json_decode(file_get_contents('php://input'), true);
        $user_province = $data['user_province'];
        $user_city = $data['user_city'];
        $user_area = $data['user_area'];
        $user_depart = $data['user_depart'];
        $user_name = $data['user_name'];
        $user_offices = $data['user_offices'];
        $user_title = $data['user_title'];
        $user_phone = $data['user_phone'];
        $user_auth = $data['user_auth'];
        $smallMajor = $data['smallMajor'];
        $threeMajor = $data['threeMajor'];
        $member_type = $data['member_type'];
        //筛选数据
        $sql = "SELECT * FROM " . $db->table('user') . " WHERE 1";
        if ($user_depart != "") {
            $sql .= " and user_depart like '%" . $user_depart . "%'";
        }
        if ($user_province != "") {
            $sql .= " and user_province like '%" . $user_province . "%'";
        }
        if ($user_city != "") {
            $sql .= " and user_city like '%" . $user_city . "%'";
        }
        if ($user_area != "") {
            $sql .= " and user_area like '%" . $user_area . "%'";
        }
        if ($user_name != "") {
            $sql .= " and user_name like '%" . $user_name . "%'";
        }
        if ($user_offices != "") {
            $sql .= " and user_offices like '%" . $user_offices . "%'";
        }
        if ($user_title != "") {
            $sql .= " and user_title = '" . $user_title . "'";
        }
        if ($user_phone != "") {
            $sql .= " and user_phone like '%" . $user_phone . "%'";
        }
        if ($user_auth != "") {
            $sql .= " and user_auth = " . $user_auth;
        }
        if ($smallMajor != "") {
            $sql .= " and smallMajor like '%" . $smallMajor . "%'";
        }
        if ($threeMajor != "") {
            $sql .= " and threeMajor like '%" . $threeMajor . "%'";
        }
        if ($member_type != "") {
            $sql .= " and member_type = " . $member_type;
        }
        $sql .= " ORDER BY user_id DESC";
        $row = $db->queryall($sql);
        //操作日志;
        $filesName = "用户信息表" . date("Y.m.d");
        //var_dump($data);
        expExcel($row, $filesName);
        break;

@漏刻有时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jumia跨境电商自养号补单测评的最新技术和策略

Jumia作为非洲最大的电商平台之一,成立于2012年,也是唯一一家真正意义上覆盖全非洲的电商平台,主要覆盖尼日利亚、摩洛哥、埃及、肯尼亚、巴基斯坦、科洛迪瓦等11个国家。 各个站点是分开运营的,各自有独立的前后台,J…

写一个类ChatGPT应用,前后端数据交互有哪几种

❝ 对世界的态度,本质都是对自己的态度 ❞ 大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 最近,公司有一个AI项目,要做一个文档问答的AI产品。前端部分呢,还是「友好借鉴」Cha…

智慧公厕系统:改变“上厕所”体验的科技革新

公共厕所是城市建设中不可或缺的基础设施,然而,由于较为落后的管理模式,会常常存在着管理不到位、脏乱差的问题。为了改善公厕的使用体验,智慧公厕系统应运而生,并逐渐成为智慧城市建设的重要组成部分。本文将以智慧公…

德昂信息-Wyn助力构建HR人员信息分析看板

”葡萄城的Wyn商业智能软件产品为德昂信息提供了强大的支持,借助Wyn商业智能软件,可以通过可视化方式展示整个公司的人员信息及其分析看板。“ ——德昂信息技术(北京)有限公司 公司简介 德昂信息技术(北京)有限公司(以下简称德昂信息&…

谷歌的 Astra 是其首款人工智能代理

谷歌将于今年晚些时候推出一款名为 Astra 的新系统,并承诺它将成为迄今为止推出的最强大、最先进的人工智能助手。 当前一代的人工智能助手,例如 ChatGPT,可以检索信息并提供答案,但仅此而已。但今年,谷歌将其助手重…

力扣HOT100 - 322. 零钱兑换

解题思路&#xff1a; 动态规划 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount 1];Arrays.fill(dp, amount 1);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j) {if (coins[j] < i) …

探索设计模式的魅力:机器学习赋能,引领“去中心化”模式新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;机器学习赋能&#xff0c;引领“去中心化”模式新纪元 ✨欢迎加入…

Linux 生态与工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…

简单的DbUtils工具类【精细】

目录 单条通用增删改方法 1.创建maven项目&#xff0c;并加载依赖 2.创建数据库连接工具类(Dbutils类) 3.创建一个执行器(SqlExecutor类) 4.通用(增&#xff0c;删&#xff0c;改)方法 1.创建方法 2.创建userInfo实体类 3.创建测试类&#xff0c;测试增&#xff0c;删&#xf…

k8s的整体架构及其内部工作原理,以及创建一个pod的原理

一、k8s整体架构 二、k8s的作用&#xff0c;为什么要用k8s&#xff0c;以及服务器的发展历程 1、服务器&#xff1a;缺点容易浪费资源&#xff0c;且每个服务器都要装系统&#xff0c;且扩展迁移成本高 2、虚拟机很好地解决了服务器浪费资源的缺点&#xff0c;且部署快&#x…

量化研究---A股赚钱日历,上证指数为例,提供源代码

今天把A股的全部数据导出做了一些赚钱日历分析&#xff0c;看那个月赚钱容易&#xff0c;那个月赚钱困难 导入需要的库 import pandas as pdimport matplotlib.pyplot as pltimport quantstats as qsfrom trader_tool.index_data import index_datafrom trader_tool import j…

IT行业的革新力量:技术进步与未来展望

在当今时代&#xff0c;信息技术&#xff08;IT&#xff09;行业无疑是全球经济的重要推动力之一。随着数字化转型的不断深入&#xff0c;IT行业的边界正在扩大&#xff0c;它不仅包括传统的软硬件开发、网络建设和运维服务&#xff0c;还涵盖了云计算、大数据、人工智能&#…

Http常见问题

这里写自定义目录标题 1. 常见状态码2. HTTP3. HTTP2 1. 常见状态码 2 xxx&#xff1a;成功 4 xxx&#xff1a;一一般是前端错误 5 xxx&#xff1a;一般是后端错误 2. HTTP 记住二点&#xff1a; 无连接&#xff1a;每次连接只处理一个请求&#xff0c;服务器处理完客户的…

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

系统思考—团队学习

结束昨日435期JSTO“探索学习的新视界&#xff1a;硬核工具分享”&#xff0c;有伙伴分享的提升效率的AI工具&#xff0c;也有自我发现团队问题解决的工具&#xff0c;伙伴们都在各自的领域实践、吸收、反馈、复盘。这次的团队学习不仅是知识的传递&#xff0c;更是一场脑力激荡…

详解pytorch中循环神经网络(RNN、LSTM、GRU)的维度

详解pytorch中循环神经网络&#xff08;RNN、LSTM、GRU&#xff09;的维度 RNNtorch.nn.rnn详解RNN输入输出维度 LSTMtorch.nn.LSTM详解LSTM输入输出维度 GRUtorch.nn.GRU详解GRU输入输出维度 三种RNN的示例 首先如果你对RNN、LSTM、GRU不太熟悉&#xff0c;可点击查看。 RNN …

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

做一个犬榜小程序,警示社会。

2024-5-15新闻&#xff1a;流浪狗咬死3岁男童。 相关链接&#xff1a;3岁男童被恶犬咬伤离世 母亲发声 急寻狗主讨公道_中华网 恶狗的主人终于付出代价 链接&#xff1a;这回&#xff0c;恶狗的主人终于付出代价 - 知乎 7岁女童家门口玩耍被恶犬咬伤头面部&#xff0c;多处撕…

【SQL每日一练】获取PADS公司用户名称和各职业总数并根据格式输出

文章目录 题目一、解析二、题解1.MySQL 题目 生成以下两个结果集&#xff1a; 1、查询 OCCUPATIONS 表中所有名字&#xff0c;紧跟每个职业的第一个字母作为括号&#xff08;即&#xff1a;括在括号中&#xff09;&#xff0c;并按名字顺序排序。例如&#xff1a;AnActorName…

OpenCV-android-sdk配置及使用(NDK)

opencv官网下载Android版Releases - OpenCV 下载好OpenCV-android-sdk并解压好,然后新建一个jni文件夹测试,测试项目目录结构如下: ├── jni │ ├── Android.mk │ ├── Application.mk │ └── test.cpp Application.mk: APP_STL := c++_static APP_CPP…