在ajax成功node.js上下载文件

2023-11-22

我正在使用 node.js 构建一个应用程序,需要允许用户下载 .csv 文件。

问题 - 当用户单击按钮时,应用程序不会将文件作为附件发送到客户端。但是,如果客户端直接访问 API 链接,则会下载该文件。例如。 - 如果用户去localhost:3000/api/exportmetric,文件将作为附件发送给客户端。但如果该路由作为 AJAX 请求被命中,则不会发生任何事情。

用户流程:

1)用户点击按钮

2)应用程序向服务器发出AJAX GET请求

3)服务器从数据库中检索数据

4)服务器将数据解析成.csv文件

5) 服务器将文件发送回客户端以附件形式下载。

My code:

客户端.js

$("#export_velocity").click(function(e) {
    console.log('export to velocity hit');
    $.ajax({
        url: 'http://localhost:3001/api/exportmetric',
        type: 'GET',
        success: function(response) {
            console.log(response);
        },
        error: function(a, b, c) {
            console.log(a);
            console.log(b);
            console.log(c);
        }
    });
});

服务器.js

router.get('/api/exportmetric', function(req, res) {
    console.log('export metric hit');
    var fields = ['first_name', 'last_name', 'age'];
    var fieldNames = ['First Name', 'Last Name', 'Age??'];
    var people = [
      {
        "first_name": "George",
        "last_name": "Lopez",
        "age": "31"
      }, {
        "first_name": "John",
        "last_name": "Doe",
        "age": "15"
      }, {
        "first_name": "Jenna",
        "last_name": "Grassley",
        "age": "44"
      }
    ];

    json2csv({ data: people, fields: fields, fieldNames: fieldNames }, function(err, csv) {
      res.setHeader('Content-disposition', 'attachment; filename=file.csv');
      res.set('Content-Type', 'text/csv');
      console.log(csv)
      res.status(200).send(csv);
    });
});

下载文件基本上有两种流行的方法。

1. Set window.location

Setting window.location到下载网址将下载该文件。

window.location = '/path/to/download?arg=1';

略有不同的版本是打开一个包含下载路径的新选项卡

window.open('/path/to/download', '_self');

2.虚拟链接点击

使用 HTML5,您可以指定download链接的属性。单击该链接(甚至以编程方式)将触发该 URL 的下载。这些链接甚至不需要成为 DOM 的一部分,您可以动态地创建它们。

var link = document.createElement('a');
link.href = '/path/to/download';
link.download = 'local_filename.csv';
var e = document.createEvent('MouseEvents');
e.initEvent('click', true, true);
link.dispatchEvent(e);

并非所有浏览器都支持此方法,因此即使您想使用此方法,也必须放弃对某些浏览器的支持或回退到第一种方法。

幸运的是,这个优秀的答案参考了一个很棒的小js图书馆已经完成了这一切——http://pixelscommander.com/polygon/downloadjs/#.VrGw3vkrKHv

downloadFile('/path/to/download');

两步下载

您经常看到的另一个约定是两步下载,其中信息通过已知的 url 发送到服务器,服务器发回生成的可用于下载文件的 url 或 id。

如果您希望 url 可以共享,或者您必须将大量参数传递给下载生成器,或者只是想通过POST要求。

$.ajax({
    type: 'POST',
    url: '/download/path/generator',
    data: {'arg': 1, 'params': 'foo'},
    success: function(data, textStatus, request) {
        var download_id = data['id'];
        // Could also use the link-click method.
        window.location = '/path/to/download?id=' + download_id;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ajax成功node.js上下载文件 的相关文章

  • 从 thymeleaf 获取数据到模态引导程序、jquery

    我正在尝试获取模态视图的 id 这是为了更新 onclick 元素 但我找不到方法 知道如何为 boostrap 5 完成此操作 或我可以用其他方法吗 谢谢 tr a inactivate a div class modal fade mo
  • 选择变量的嵌套元素 - jQuery

    我希望将变量传递给函数并让函数选择该变量中的元素 我不熟悉这种情况的语法 但是有人可以建议吗 例如 当在容器内单击按钮时 我希望将该容器存储在变量中 好吧 我有那部分 但后来我希望选择该容器中的某个元素 例如 container div e
  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • Jquery 组合 SlideUp/Down 并单击

    我创建了两个脚本 其中一个具有向上滑动和向下滑动命令 这些命令在页面加载时作用于计时器 第二个是单击事件 其中单击链接时执行向上 向下滑动命令 这两个脚本都是单独工作的 但我无法让它们一起工作 这是定时向上 向下滑动脚本 document
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • Node.js:无法从同一网络上的不同设备访问服务器

    注意 还有其他一些人也遇到过类似的问题 但这些问题是通过修复代码中涉及服务器如何侦听的小花絮来解决的 在我看到的示例中 他们将 127 0 0 1 作为参数放在http createServer listen 但是 我没有同样的问题 当我尝
  • PNG 透明度问题 - 带有黑色阴影的褪色图像 - IE 中的边框

    我使用图像旋转器在主页上显示一些图像 所有图像均为 PNG 格式 问题出在 IE 7 8 中 图像旁边有黑色阴影 我花了几个小时来解决这个问题 但仍然不知道问题出在哪里以及如何删除它 没有人有类似的问题和提示吗 如何解决 尝试使用 img
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • 如何以编程方式处理 JqGrid 事件?

    我正在使用JqG rid 的 ASP NET 包装器 http www trirand net demoaspnet aspx 我想以编程方式连接一些网格的处理程序events http www trirand com jqgridwiki
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • 动态地将工具提示文本设置为 div 元素

    我正在尝试动态地将工具提示文本设置为容器 div 并对我刚刚添加到有序列表的每个 div 元素 elem Alias Status 使用 jQuery function addNewElement elem var li li li li
  • ajax4jsf死了吗?还有哪些其他适用于 JSF 的 AJAX 库?

    我目前正在使用JBoss RichFaces http www jboss org jbossrichfaces 我正在从事的项目的 JSF 组件库 一般来说 它工作得很好 特别是 ajax4jsf A4J 提供的 AJAX 支持 但我发现
  • aws - 将字符串作为文件上传到 S3 存储桶

    我尝试使用适用于 NodeJS 的 AWS 开发工具包将字符串作为文件保存到 AWS S3 存储桶 PUT 请求成功 但文件未在 S3 存储桶中创建 以下是我的代码片段 const s3 new S3 apiVersion 2006 03
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Jquery 验证不能正确验证数字?

    我在使用 jquery 非侵入式验证验证数字时遇到问题 我使用的版本是 ASP NET MVC 3 jQuery 1 9 1 jQuery 用户界面 1 10 1 JQuery 验证 1 11 0 我试图验证的输入是
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • Mongoose - 查询从多个集合中获取数据

    我想要获取猫鼬的查询在 Node js 应用程序中 如下所述输出 user js comment js 和 post js 是我使用的模型文件 user js var mongoose require mongoose var Schema

随机推荐

  • 在 XAML 中更改 ToolBarItem 的颜色

    我在我的应用程序中添加了一个工具栏项 但是我没有看到更改其背景和文本颜色的方法
  • 可以使用jquery动态添加注释到代码中吗?

    I tried 但由于我不知道的原因它不起作用 谁能帮助我理解为什么它不起作用以及我该如何做 谢谢 非常感谢 看起来你正在尝试用 class消失 使用 hide 反而 仅当浏览器首次加载页面时才会解析注释 因此添加注释不会注释掉某些内容 您
  • jQuery $.get/$.ajax 传递 HTTP 状态代码 200,而不是预期的状态代码 201 或 202

    我有一个从同一 URL 返回 HTTP 状态代码 200 201 和 202 的服务器 在 Chrome 中 我已通过网络调试面板确认状态代码符合我的预期 即 200 201 或 202 我依靠该状态代码来确定下一步 我希望 jQuery
  • 这不是一个元组吗?

    我不明白我在这里做错了什么 我的错误是 在 admin 处配置不正确类别管理字段 必须是列表或元组 CategoryAdmin fields 不是一个元组吗 我读错了吗 admin py class CategoryAdmin admin
  • 如何将语言环境字符串(货币)转换回数字?

    我在用着toLocaleString https developer mozilla org en US docs Web JavaScript Reference Global Objects Number toLocaleString转
  • 如何使用 jQuery 将事件附加到动态 HTML 元素? [复制]

    这个问题在这里已经有答案了 假设我有一些 jQuery 代码 将事件处理程序附加到具有类的所有元素 myclass 例如 function myclass click function do something 我的 HTML 可能如下所示
  • 如何将受信任的 CA 证书(不是客户端证书)添加到 HttpWebRequest?

    我写了一个 C 程序 使用HttpWebRequest连接到 HTTPS 站点 这GetResponse 方法抛出异常 系统错误 底层连接已关闭 无法建立 SSL TLS 安全通道的信任关系 我可以使用连接到同一个网站curl exe ca
  • 更新失败时Mysql事务回滚

    通过简单的交易 START TRANSACTION UPDATE posts SET status approved where post id id AND status approved other queries COMMIT 我只想
  • 为什么PHP的md5与OpenSSL的md5不同?

    我很困惑为什么我在 PHP 和 OpenSSL 中看到不同的 md5 哈希结果 这是我正在运行的代码 php r echo md5 abc 结果 900150983cd24fb0d6963f7d28e17f72 虽然这样 echo abc
  • Carbon 解析日期格式

    我正在尝试解析格式如下的日期 2017 09 20T10 59 10 0000000 01 00 我正在使用碳 所以我尝试了 Carbon createFromFormat Y m dTH i s u vP date 哪个输出 The ti
  • 在java中生成没有重复的变体/排列

    我必须生成所有不重复的数字 0 9 的变体 它们的长度可能从1到10 我真的不知道如何解决它 特别是如何避免重复 例子 变化长度 4 随机变化 9856 8753 1243 1234 等 但不是 9985 包含重复 你能帮我么 或者你能给我
  • std::transform() 和 toupper(),没有匹配的函数

    我尝试了这个问题的代码C std transform 和 toupper 为什么会失败 include
  • 如何打印出字符串并在一行中列出-python

    a 1 2 3 print the list is a 我想打印出这样的一行 the list is 1 2 3 我不能在一行内完成它 我必须这样做 print the list is print a 我想知道是否可以在一行中打印出与字符串
  • 具有多个命名参数的 PDO bindParam()

    PDO 不能使用单个 bindParam 将值绑定到查询中多次出现的参数吗 我很惊讶 我认为这是可能的 但我没有在 php 文档上找到任何关于此的信息 在网络上也没有 欢迎任何澄清 替代方案 注意 我使用的是 php 5 3 6 5 3 8
  • 使用 awk 更改字符串的大小写

    我是 awk 新手 所以请耐心等待 目标是更改字符串的大小写 使每个单词的第一个字母大写 其余字母小写 为了使示例简单 单词 在这里被定义为严格的字母字符 所有其他字符都被视为分隔符 我从本网站的另一篇文章中学到了一种使用以下 awk 命令
  • 使用 httpInterceptor 和 AngularJS 1.1.5 实现加载微调器

    我在这里找到了一个用于 http resource 调用的加载微调器的示例 在 httpIntercept 上设置 rootScope 变量 笨蛋 http plnkr co edit 32Mh9UOS3Z4vnOtrH9aR p prev
  • 在 .Net 中使用 GDI+ 勾勒出路径

    如何使用 GDI 绘制图形路径 例如 我将两个相交的矩形添加到 GraphicsPath 中 我只想绘制所得图形路径的轮廓 请注意 我不想填充该区域 我只想绘制轮廓 Example 没有有效的方法来绘制大纲 然而 GDI 确实有一个名为 G
  • 有没有可以在 Android 上运行的免费 PDF 解析库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我已经在互联网上寻找了一个真正可以在 Android 上运行的 PDF 解析器 我已经尝试过一些安静的 java 库 但它们在 Android 上运
  • Convert.ToInt32 和 Int32.Parse 有什么区别? [复制]

    这个问题在这里已经有答案了 In C 在那里你可以使用两者将字符串转换为 Int32Int32 Parse and Convert ToInt32 他们之间有什么区别 哪个表现更好 我应该在哪些场景下使用Convert ToInt32 ov
  • 在ajax成功node.js上下载文件

    我正在使用 node js 构建一个应用程序 需要允许用户下载 csv 文件 问题 当用户单击按钮时 应用程序不会将文件作为附件发送到客户端 但是 如果客户端直接访问 API 链接 则会下载该文件 例如 如果用户去localhost 300