1

我正在尝试通过 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文件(最终是动态的)。我将如何正确地做到这一点?有些东西告诉我我需要指定标题/内容类型。

4

2 回答 2

5

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

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

我相信你必须重定向到这个文件。如果我没记错的话,您不能通过 AJAX 调用强制下载文件。

于 2012-06-22T21:23:07.777 回答
1

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

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

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

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

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

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

希望有帮助。一切顺利!克林特

于 2012-06-22T21:23:12.260 回答