将文本作为下载文件发送

8
尝试将简单的文本字符串作为文件发送,该文件在请求时以特定名称下载。无法弄清楚为什么此代码失败。
var text_ready = "This is a content of a txt file."
res.setHeader('Content-type', "application/octet-stream");
res.setHeader('Content-disposition', 'attachment; filename=file.txt');
res.send( new Buffer(text_ready) );

当这段代码执行时,我只收到一个XHR响应(其内容为该字符串),但没有启动下载。但是我期望接收到此响应后,浏览器会强制下载一个名为file.txt的文件,其中包含上述字符串的内容。
如何解决?我错在哪里了?
也许这很重要:在Windows上使用Chrome 41运行。
编辑:似乎我需要更深入地描述一下工作流程:
页面包含带有angular ng-click事件附加到每个单元格的表单单元格
单击时,使用jQuery的$.get(“/ download”)发送GET请求到“/ download”
服务器有路由来处理这些GET请求
我的目标是将某个文本字符串发送给用户并保存为文件(简而言之,在单击时启动下载)
测试:
当我手动导航到该URL并按Enter键时,它起作用
当我使用鼠标单击该单元格时,它不起作用-发送请求,接收响应,但未启动下载。
1个回答

14

在我的 node.js 版本 0.12.2、Windows 7、Chrome 和 Firefox 上测试通过。

var http = require('http');

http.createServer(function (req, res) {
var text_ready = "This is a content of a txt file."


res.writeHead(200, {'Content-Type': 'application/force-download','Content-disposition':'attachment; filename=file.txt'});

res.end( text_ready );
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');

我认为你没有运行最新版本的node.js。也许你可以仅更改Content-type头部,这可能会奏效。此外,你可以使用res.end( new Buffer(text_ready) );。我已经测试过了。

编辑: 如何通过javascript(jQuery onClick)调用从node.js下载文件:

Javascript:

<script type="text/javascript">
$(document).ready(function(){
    $("#button").on('click',function(){
        window.location = 'http://127.0.0.1:1337/';
    });
});
</script>

HTML:

<button id="button">下载</button>

我相信你知道如何从jQuery重写到angularJS。 :) 我认为这比使用Ajax调用更好。如果你真的需要Ajax,我会找出如何做到。


我有node 0.11.30和express 4.3.2。仍然不起作用。这可能是因为这是一个使用jQuery的POST请求(而不是GET请求)吗? - kaytrance
2
你不能使用ajax调用下载文件。是否可以使用iframe?类似于<iframe src="http://127.0.0.1:1337/" />或者尝试这个链接:https://dev59.com/_mEi5IYBdhLWcg3w6f2e - Kristiyan
我已经编辑了初始问题,以更好地描述我正在尝试做什么。据我所知,问题是由于ajax引起的。 - kaytrance
2
使用 window.location = "/download/" 已经使其正常工作,但我仍会标记您的答案为可接受。 - kaytrance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接