【问题标题】:Content-Disposition:attachment not triggering download dialog内容处置:附件不触发下载对话框
【发布时间】:2014-12-31 12:06:51
【问题描述】:

尝试在我的 NodeJS 服务器上创建文件下载功能时,我遇到了一些意外行为。 我有一个 REST (express) API,它调用一些导出数据函数,它在服务器上创建一个 CSV 文件并使用res.download('path/to/file') 来触发下载。 响应头包括

Content-Disposition:attachment; filename="indicators.csv"
Content-Length:30125
Content-Type:text/csv; charset=UTF-8

所以一切似乎都井井有条。

问题是,我从服务器得到纯文本的响应。响应包含 CSV 文件包含的所有数据,但不会像我预期的那样触发浏览器的文件下载对话框。 我在 Chrome 和 FF 上都试过了。两个问题都存在。

有什么想法吗?

更新

我设法通过创建一个虚拟表单并使用它的提交操作来进行我的 AJAX 调用来使其工作。但这是一个丑陋的 hack,我仍在寻找更优雅的解决方案。

【问题讨论】:

    标签: javascript node.js csv express content-disposition


    【解决方案1】:

    标题不是问题。问题是您正在通过 ajax 调用查询下载 url,这不会调用浏览器下载对话框。您的选择归结为以下几点:

    1. 使用提交到您的下载 URL 的表单。无需用户必须与之交互的可见表单,而是使用JavaScript 创建一个表单并通过调用form.submit - Handle file download from ajax post 以编程方式提交它

    2. window.location 指向下载网址。您可以在当前窗口中执行此操作 - download file using an ajax request ,或在新窗口中执行此操作 - res.download() not working in my case

    【讨论】:

    • 正如您在我的问题中看到的,选项 1 是我最终使用的。但我必须承认,就我而言,选项 2 可能是一个更优雅的解决方案。
    【解决方案2】:

    您可以尝试使用不同的内容类型,这样就不会在浏览器上作为文本文件打开:

    Content-Type:application/ms-excel; charset=UTF-8
    

    另一种选择是使用 application/octet-stream 作为 mime-type 将其定义为可下载文件,无需更好的描述。

    Content-Type:application/octet-stream; charset=UTF-8
    

    【讨论】:

      【解决方案3】:

      这个问题看起来和这个类似

      Show 'Save as' dialog box while downloading file from an Iframe through PHP

      基本思想是上面罗曼描述的第二个选项,但是这个是使用 iframe 来实现的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 2013-08-02
        相关资源
        最近更新 更多