当前位置: 首页 > news >正文

XMLHttpRequest和FormData下载文件,ajax下载文件

1、前端请求只做下载功能

function downloadDatas3() {// 封装请求参数let formData = new FormData();formData.append('page', '1');formData.append('rows', '10');// 创建xhr对象let xhr = new XMLHttpRequest();xhr.open('POST', 'http://127.0.0.1:8080/getData');// xhr.setRequestHeader('Content-Type', 'application/json');xhr.responseType = 'blob';// 设置响应类型为blob,以便处理二进制数据xhr.send(formData);xhr.onload = function () {if (this.status == 200) {let blob = this.response;let a = document.createElement('a');let url = window.URL.createObjectURL(blob);//获取文件名称let fileName = decodeURI(xhr.getResponseHeader('Content-Disposition'));//截取=字符串后面的内容let str = fileName.match(/=(\S*)/)[1];a.href = url; // 设置链接源a.download = str; // 设置下载文件名document.body.appendChild(a); // 将链接加入到DOMa.click(); // 触发下载a.remove(); // 删除链接window.URL.revokeObjectURL(url); // 释放URL对象}}xhr.onerror = function (event) {alert('文件下载失败!');}
}

2、前端请求下载失败,提示失败原因


function downloadDatas3() {// 封装请求参数let formData = new FormData();formData.append('page', '1');formData.append('rows', '10');// 创建xhr对象let xhr = new XMLHttpRequest();xhr.open('POST', 'http://127.0.0.1:8080/getData');// xhr.setRequestHeader('Content-Type', 'application/json');xhr.responseType = 'blob';// 设置响应类型为blob,以便处理二进制数据xhr.send(formData);xhr.onload = function () {if (this.status == 200) {let blob = this.response;// 根据type类型,区分是下载文件还是下载失败原因if ('text/html' == blob.type) {let fileReader = new FileReader(); //FileReader可以读取Blob内容fileReader.readAsText(blob); //二进制转换成textfileReader.onload = function () {  //转换完成后,调用onload方法let result = fileReader.result;  //result 转换的结果let data = JSON.parse(result);alert(data.msg);}return;}let a = document.createElement('a');let url = window.URL.createObjectURL(blob);//获取文件名称let fileName = decodeURI(xhr.getResponseHeader('Content-Disposition'));//截取=字符串后面的内容let str = fileName.match(/=(\S*)/)[1];a.href = url; // 设置链接源a.download = str; // 设置下载文件名document.body.appendChild(a); // 将链接加入到DOMa.click(); // 触发下载a.remove(); // 删除链接window.URL.revokeObjectURL(url); // 释放URL对象}}xhr.onerror = function (event) {alert('文件下载失败!');}
}

后端处理逻辑

下载文件使用响应头为 Content-Type=application/octet-stream
下载文件失败,使用响应头为 Content-Type=text/html
前端根据不同的响应头类型,来区分是下载文件,还是失败原因。

    @PostMapping("/getData")public void getData(HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();try {// 请求参数String currPage = request.getParameter("page");String pageSize = request.getParameter("rows");// 下载文件String fileName = "测试.xlsx";// 设置服务器输出的编码为UTF-8response.setCharacterEncoding("UTF-8");// 设置response的Headerresponse.addHeader("Content-Type", "application/octet-stream");response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));ServletOutputStream os = response.getOutputStream();// 响应输出流int len;byte[] buffer = new byte[4096];FileInputStream fis = new FileInputStream("/tmp/" + fileName);while ((len = fis.read(buffer)) != -1) {os.write(buffer, 0, len);os.flush();}os.close();fis.close();map.put("code", 200);map.put("msg", "下载成功");} catch (Exception e) {log.error(e.getMessage(), e);map.put("code", 500);map.put("msg", "下载数据异常!");} finally {// 处理失败if (200 != (int) map.get("code")) {try {String msg = JSON.toJSONString(map);response.setContentType("text/html; charset=UTF-8");ServletOutputStream os = response.getOutputStream();os.write(msg.getBytes(StandardCharsets.UTF_8));os.flush();os.close();} catch (IOException e) {log.error(e.getMessage(), e);}}}}

相关文章:

XMLHttpRequest和FormData下载文件,ajax下载文件

1、前端请求只做下载功能 function downloadDatas3() {// 封装请求参数let formData new FormData();formData.append(page, 1);formData.append(rows, 10);// 创建xhr对象let xhr new XMLHttpRequest();xhr.open(POST, http://127.0.0.1:8080/getData);// xhr.setRequestHe…...

针对考研的C语言学习(2014二叉树大题代码实战)

题目描述 解析 1.递归思想遍历节点&#xff0c;若是叶子结点就累加计算的wpl&#xff0c;反之继续遍历 2.代码如下 //树 typedef struct trees {ElemType data;struct trees* lc;struct trees* rc; }treeNode, * Tree;3.算法设计 //deep路径长度也叫做深度&#xff0c;0开始 …...

webpack面试笔记(一)

一.webpack基础 1.模块化 什么是模块化? 模块化是把一个复杂的系统分解到多个模块以方便编码 为什么出现模块化 以前使用命名空间的方式来组织代码,比如jQuery,zepto, 它们有很多缺点: 命名空间冲突,两个库可能会使用同一个名称,例如zepto也被放在window.$下无法合理管理项目…...

雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名&#xff0c;那么当使用进行 IP 请求时&#xff0c;则将会命中第一个配置的站点 以上图为例&#xff0c;如果用户使用 IP 访问&#xff0c;命中 example.com。 如果域名处填写的分别为域名与泛域名&#xff0c;除非准确命中域名&#xff0c;否…...

【小白学机器学习15】 概率论的世界观

目录 1 最近看的几本书和想说的 1.1 最近看的书 1.2 为什么写这个 2 概率论的观点看世界 2.1 上帝掷骰子&#xff0c;没有绝对的事情&#xff0c;所有事情都是概率决定的&#xff0c;都是相对的。 2.2 万物皆可能&#xff0c;无物是必然 2.3 什么是&#xff1a;可能性…...

合成数据用于大模型训练的3点理解

最近看国内对合成数据的研究讨论也变得多 ,而不单单是多模态,扩散模型这些偏视觉类的, 因此就合成数据写一下目前的情况。 2023年国外就有很多研究合成数据的论文, 包括Self-Consuming Generative Models Go MAD, Crowd Workers Widely Use Large Language Models for Text Pr…...

Safari 中 filter: blur() 高斯模糊引发的性能问题及解决方案

目录 引言问题背景&#xff1a;filter: blur() 引发的问题产生问题的原因分析解决方案&#xff1a;开启硬件加速实际应用示例性能优化建议常见的调试工具与分析方法 引言 在前端开发中&#xff0c;CSS滤镜&#xff08;如filter: blur()&#xff09;的广泛使用为页面带来了各种…...

浏览器实时更新esp32-c3 Supermini http server 数据

一利用此程序的思路就可以用浏览器显示esp32 采集的各种传感器的数据&#xff0c;也可以去控制各种传感器。省去编写针对各系统的app. 图片 1.浏览器每隔1秒更新一次数据 2.现在更新的是开机数据&#xff0c;运用此程序&#xff0c;可以实时显示各种传感器的实时数据 3.es…...

【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus

文章目录 一、先决条件1.1 安装AWS CLI ✅1.2 安装 EKS 相关工具✅1.3 创建 Amazon S3 存储桶✅1.4 创建 Amazon MSK 实例✅ 二、创建EKS集群三、创建 ebs-sc StorageClass四、安装 AWS Load Balancer Controller五、部署 Milvus 数据库5.1 添加 Milvus Helm 仓库5.2 配置 S3 作…...

pytorch安装GPU版本,指定设备

安装了GPU版本的pytorch的时候&#xff0c;想要使用CPU&#xff0c;怎么操作呢&#xff1f; 设置环境变量&#xff1a; set TF_FORCE_GPU_ALLOW_GROWTHfalse set CUDA_VISIBLE_DEVICES如果想要使用固定序号的GUP设备&#xff0c;则指定ID set CUDA_VISIBLE_DEVICES0 # 使用第…...

草地杂草数据集野外草地数据集田间野草数据集YOLO格式VOC格式目标检测计算机视觉数据集

一、数据集概述 数据集名称&#xff1a;杂草图像数据集 数据集是一个包含野草种类的集合&#xff0c;其中每种野草都有详细的特征描述和标记。这些数据可以包括野草的图片、生长习性、叶片形状、颜色等特征。 1.1可能应用的领域 农业领域: 农业专家和农民可以利用这一数据集来…...

顺序表排序相关算法题|负数移到正数前面|奇数移到偶数前面|小于x的数移到大于x的数前面|快排思想(C)

负数移到正数前面 已知顺序表 ( a 1 , … , a n ) (a_{1},\dots,a_{n}) (a1​,…,an​)&#xff0c;每个元素都是整数&#xff0c;把所有值为负数的元素移到全部正数值元素前边 算法思想 快排的前后指针版本 排序|冒泡排序|快速排序|霍尔版本|挖坑版本|前后指针版本|非递归版…...

【小白学机器学习20】单变量分析 / 0因子分析 (只分析1个变量本身的数据)

目录 1 什么是单变量分析&#xff08;就是只分析数据本身&#xff09; 1.1 不同的名字 1.2 《戏说统计》这本书里很多概念和一般的书不一样 1.3 具体来说&#xff0c;各种概率分布都属于单变量分析 2 一维的数据分析的几个层次 2.1 数据分析的层次 2.2 一维的数据为什么…...

[软件工程]—桥接(Brige)模式与伪码推导

桥接&#xff08;Brige&#xff09;模式与伪码推导 1.基本概念 1.1 动机 由于某些类型的固有的实现逻辑&#xff0c;使它们具有两个变化的维度&#xff0c;乃至多个维度的变化。如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术是的类型可以轻松的沿着两个乃至…...

TensorFlow面试整理-TensorFlow 结构与组件

TensorFlow 的结构和组件是其功能强大、灵活性高的重要原因。掌握这些结构和组件有助于更好地理解和使用 TensorFlow 构建、训练和部署模型。以下是 TensorFlow 关键的结构与组件介绍: 1. Tensor(张量) 定义:张量是 TensorFlow 中的数据载体,类似于多维数组或矩阵。张量的…...

linux下gpio模拟spi三线时序

目录 前言一、配置内容二、驱动代码实现三、总结 前言 本笔记总结linux下使用gpio模拟spi时序的方法&#xff0c;基于arm64架构的一个SOC&#xff0c;linux内核版本为linux5.10.xxx&#xff0c;以驱动三线spi(时钟线sclk&#xff0c;片选cs&#xff0c;sdata数据读和写使用同一…...

makesense导出的压缩包是空的

md ,那些教程感觉都不是人写的&#xff0c;没说要在右边选标签&#xff0c;我本来就是一个标签&#xff0c;我以为他会自动识别打标&#xff0c;结果死活导出来空包 密码要在右边选标签&#xff0c;...

Spring Boot框架下的中小企业设备维护系统

5系统详细实现 5.1 用户信息管理 中小企业设备管理系统的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.2 员工信息管理 管理员可以对员工信息进行添加修改删除操作。具体界面如图5.2所示。 图5.2 员工信息界面…...

处理文件上传和进度条的显示(进度条随文件上传进度值变化)

成品效果图&#xff1a; 解决问题&#xff1a;上传文件过大时&#xff0c;等待时间过长&#xff0c;但是进度条却不会动&#xff0c;只会在上传完成之后才会显示上传完成 上传文件的upload.component.html <nz-modal [(nzVisible)]"isVisible" [nzTitle]"文…...

【套题】大沥2019年真题——第5题

05.魔术数组 题目描述 一个 N 行 N 列的二维数组&#xff0c;如果它满足如下的特性&#xff0c;则成为“魔术数组”&#xff1a; 1、从二维数组任意选出 N 个整数。 2、选出的 N 个整数都是在不同的行且在不同的列。 3、在满足上述两个条件下&#xff0c;任意选出来的 N 个整…...

上传Gitee仓库流程图

推荐一个流程图工具 登录 | ProcessOnProcessOn是一个在线协作绘图平台&#xff0c;为用户提供强大、易用的作图工具&#xff01;支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时依托于互联网实现了人与人之间的…...

二叉树相关OJ题 — 第一弹

目录 1. 检验两棵树是否相同 ​编辑 1. 题目解析 2. 解题步骤 2.判断一棵大树中是否包含有和一棵小树具有相同结构和节点值的子树 1. 题目解析 2. 解题步骤 3. 翻转二叉树 1. 题目解析 2.解题步骤 4. 判断一颗二叉树是否是平衡二叉树 1. 题目解析 2. 解题步骤…...

【学习笔记】RFID

RFID 1、 概述 1.1、RFID 介绍 1.2、RFID 发展史 1.3、RFID 系统的构造 1.3.1、阅读器 Reader 和 天线 Antenna 1.3.3、电子标签 tag 1.4、电子标签按吐字率分类 1.5、电子标签按能量供应的方式划分 1.6、RFID 工作流程 …...

自动化部署-01-jenkins安装

文章目录 前言一、下载安装二、启动三、问题3.1 jdk版本问题3.2 端口冲突3.3 库文件加载问题3.4 系统字体配置问题 四、再次启动五、配置jenkins5.1 解锁5.2 安装插件5.3 创建管理员用户5.4 实例配置5.5 开始使用5.6 完成 总结 前言 spingcloud微服务等每次部署到服务器上&…...

AI工具大爆发,建议每个都使用收藏

2024年被誉为AI应用元年&#xff0c;这一年人们普遍意识到&#xff0c;未来占据主导地位的将是基于大模型的应用程序&#xff0c;而不仅仅是大模型本身。因此&#xff0c;在这一趋势的推动下&#xff0c;各式各样的AI应用如雨后春笋般涌现出来。 今天就聊聊这些好用的AI工具&a…...

Mybatis之参数处理

在MyBatis中&#xff0c;参数处理是非常关键的部分&#xff0c;它负责将传入的参数正确映射到SQL语句中 单个简单类型参数 简单类型对于mybatis来说都是可以自动类型识别的&#xff1a; 也就是说对于mybatis来说&#xff0c;它是可以自动推断出ps.setXxxx()方法的。ps.setSt…...

windows内核探索--打印windows的GDT表(全局描述符表)

x86 #include <windows.h> #include<stdio.h> #include "x86struct.h" void PrintSegmentDescriptor(ULONG64* sd, WORD Count); SegmentSelector GetSegmentSelector(USHORT Selector); int main() {printf("0环cs段寄存器 ");GetSegmentSel…...

【ChatGPT】让ChatGPT帮助进行头脑风暴与创意生成

让ChatGPT帮助进行头脑风暴与创意生成 在日常工作和生活中&#xff0c;创意和头脑风暴是解决问题、创新和推动项目的关键步骤。ChatGPT&#xff0c;作为一个强大的语言模型&#xff0c;不仅可以提供信息和答案&#xff0c;还可以成为强大的头脑风暴工具&#xff0c;帮助用户快…...

大数据处理随堂测试

HDFS MapReduce HBase Spark...

2024最新pycharm安装教程及基本使用(超详细,新手小白必看)

文章目录 前言一、官网下载二、安装步骤三、使用示范四、番外篇&#xff08;汉&#xff09;大纲 PythonPyCharm安装包领取方式戳‘这块里’ 前言 一、官网下载 1. 进入pycharm官网&#xff0c;点击下载 PyCharm: The Python IDE for data science and web development by J…...

电商分销主要做什么/seo入门培训学校

若传递参数为对象&#xff0c;需使用Post请求&#xff0c;不能使用GetMapping&#xff0c;否则会报405错误consumer的feignClient接口和provider接口参数加上RequestBody注解 &#xff0c;否则会传参失败 //feignClient RequestMapping("/loginByUser" ) public boo…...

网站流量来源/企业管理软件管理系统

jQuery UI是一套非常好用的jQuery Tools库&#xff0c;目前已经发布的最新版本是1.8.4。在我自己的使用过程中&#xff0c;总有一些不爽。因为我下载的那个包里默认的主题样式是下图这样的&#xff0c;使用起来很难和具体的网页风格去配合。 一开始&#xff0c;我准备去动手&am…...

以网站名为后缀的邮箱怎么做/seo排名优化app

3.1 打开报表打开报表&#xff1a;%FR_HOME%\WebReport\WEB-INF\reportlets\demo\analytics\multi_report\all.frm3.2 报表块设置选中表单中的报表块report0&#xff0c;点击工具栏上的冻结&#xff0c;弹出重复与冻结设置对话框&#xff0c;勾选并设置重复标题行从第1行至第2&…...

哪里有做鸭的网站/小说排行榜

传送门: http://wenku.baidu.com/link?urlrdAijt1svnyDOnJ6QWAjoKcePe3nZjwXSEBBcFUaFhxfLxrdMX7UIL-YdUYgJdOIDj9EsjVYrjtYRqwHj3L5fgaNRZidNXvj_nTZA9SEAk_...

呼和浩特企业网站/公众号营销

我们在之前就讨论了为什么在高并发的情况下&#xff0c;程序会崩溃。主要原因是&#xff0c;在高并发的情况下&#xff0c;有大量用户请求需要程序计算处理&#xff0c;而目前的处理方式是&#xff0c;为每个用户请求分配一个线程&#xff0c;当程序内部因为访问数据库等原因造…...

wordpress 安装百度统计/seo

2010-11-04 12:18:11| 分类&#xff1a; iOS 应用开发|字号 订阅 neogui2008-09-01 15:57Q: 如何在XCode中使用gcc编译生成的.a库文件&#xff1f;1. 把你的.a文件添加到^projectName下的任意一個組里&#xff08;例如默認的Classes組&#xff09;。2. 找到Target > ^targe…...