当前位置: 首页 > 面试题库 >

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

闾丘德宇
2023-03-14
问题内容

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

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

用户流:

1)用户单击一个按钮

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

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

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

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

我的代码:

client.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);
        }
    });
});

server.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套window.location

设置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;
    }
});


 类似资料:
  • 问题内容: 我一直在使用它来加载另一个页面,仅使用他们的示例: 但是我想在加载成功时运行一个函数,如果加载失败,则运行另一个函数,不幸的是,回调函数上的描述是: 当ajax请求完成(不一定成功)时调用的函数。 如何确保加载成功? 谢谢。 问题答案: 您可以尝试使用更详细的$ .ajax()方法调用。这将为您提供对AJAX调用的更细粒度的控制(但是,与简单的.load()相比,它还需要做更多的工作。

  • 问题内容: 我正在应用程序中下载动态文件,并使用iframe来模拟ajax。我正在做的是,当下载请求发出后,我将创建一个动态的不可见iframe,并将iframe的src设置为下载网址。我能够成功下载该文件,但要求是显示一个下载下载指示器一旦开始下载,并在下载对话框出现后立即完成。我在创建iframe后提供了回调,以显示下载指示器已成功运行,并在iframe的“ onload”上提供了另一种方法,

  • 我有Node.js应用程序,前端在Angular中,我需要上传和下载文件到Azure Blob/Azure存储 我已经按照这里给出的说明进行了操作:https://github.com/azure/azure-sdk-for-js/blob/master/sdk/storage/storage-blob/samples/typescript/src/basic.ts 下面是我的代码,它列出了BLO

  • 问题内容: 我正在使用Ajax发布将表单数据提交到服务器,进行验证,然后根据数据是否有效并可以存储返回一条消息。我的ajax帖子中的成功功能没有运行。这是ajax帖子和成功消息的显示: 标签上没有显示任何消息。我尝试在代码中将successmessage变量设置为一个设置值,并且显示效果很好,所以成功函数一定存在问题,我看不到什么?我也尝试设置错误回调,如下所示: 但是仍然没有消息显示。 问题答案

  • 问题内容: 我想绑定到一个ajax“事件”,这意味着我希望只要成功检索到一个ajax响应就触发它。我不知道如何绑定这样的事件。我需要像这样使用吗? PS我确实需要使用,因为整个页面是通过ajax调用插入的。 问题答案: 您可以使用 或绑定到

  • 本文向大家介绍javaweb实现文件上传与下载功能,包括了javaweb实现文件上传与下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下 一、文件上传 要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 上传大多数情况是通过表单