【问题标题】:Node.js / Express : download file via ajaxNode.js / Express:通过 ajax 下载文件
【发布时间】:2012-06-22 21:15:06
【问题描述】:

我正在尝试通过 GET ajax 调用动态请求下载文件。我有以下客户端代码:

$(function() {
    $('#submit').click(function() {
        $.ajax({
            type: "GET",
            url: "/download/" + "filename",
            dataType: "json",
            contentType: "application/json",
            complete: function() {
                console.log('Complete');
            },
            success: function() {
                console.log('Success');
            },
            error: function() {
                console.log('Error');
            }
        });
    });
});

在节点服务器上,我也有以下行(请注意,我不知道这是否是正确的方法)

app.get('/download/:filename', function(req, res) {
    console.log(req.params);
    res.write(fs.readFileSync(__dirname + "/../public/javascripts/main.js", 'utf8'));
});

所以我想实际下载那个 javascript 文件(最终是动态的)。我将如何正确地做到这一点?有些东西告诉我我需要指定标题/内容类型。

【问题讨论】:

  • 我很确定你不能用 Ajax 做到这一点。更好的策略是在 iframe 中加载文件根据@Bit Destroyer 的建议设置标题。
  • 根据@apsillers 的建议,如果我没记错的话,当浏览器重定向到具有上述标题的文件时,它实际上并没有离开当前页面,而是打开了保存文件对话框。考虑到这一点,iframe 可能是多余的,但不要相信我的话。 (巴达达姆)
  • @Bit,有趣!我必须检查一下,看看它是否可以跨浏览器工作。
  • 嘿,很棒的建议/想法。我试试看。
  • 但是,由于我正在处理一个文本文件,我将如何防止浏览器仅查看它?我想提示用户下载它。

标签: javascript node.js get


【解决方案1】:

您应该返回内容类型和处置设置为:

Content-Type: application/octet-stream
Content-Disposition: attachment;filename=\"main.js\"

我相信您将不得不重定向到此文件。如果我没记错的话,您不能通过 AJAX 调用强制下载文件。

【讨论】:

    【解决方案2】:

    您是否打算将 .js 文件解释并应用于下载页面?

    如果是这样,您可能最终会使用 write() 来分页,无论您如何获取它,这不是最佳实践。

    请查看require.js。这是异步和动态加载脚本并在运行时应用它们的更好方法。

    使用手动解决方案下载动态 .js 文件时会遇到的一个困难是依赖关系。在 .js 文件上依赖于另一个会导致盲目的 js 未定义错误。

    此外,在将同步包含文件转换为异步包含文件时,还可以优化运行时性能。

    Require.js 很好地解决了这些问题。

    希望对您有所帮助。 祝一切顺利! 克林特

    【讨论】:

    • 我真的想下载文件。不要在页面上包含它,或者通过浏览器重定向到它的文本表示。
    • 感谢您的澄清。我很抱歉。注意 XSRF 安全漏洞,特别是如果 JS 来自您以外的任何地方。希望有帮助。纳什。
    猜你喜欢
    • 2016-07-08
    • 2014-12-23
    • 2013-05-16
    • 1970-01-01
    • 2011-10-03
    • 2023-03-16
    相关资源
    最近更新 更多