在 node.js 中从字符串创建一个文本文件并将其作为响应流式传输
Posted
技术标签:
【中文标题】在 node.js 中从字符串创建一个文本文件并将其作为响应流式传输【英文标题】:Create a text file in node.js from a string and stream it in response 【发布时间】:2014-03-23 21:20:58 【问题描述】:我正在使用 express.js
我有一个字符串“Hello world!”
我希望用户点击
<a href=/download>Download</a>
用户应该下载带有文本的 Hello.txt,而不是打开带有文本的选项卡。
我已经四处寻找实现这一点的方法,我猜这与从缓冲区创建读取流和管道到响应有关,但我的大多数示例都涉及从磁盘读取实际文件,我不'不想从磁盘读取,我只想用一个从字符串创建的文件来响应。
谢谢!
【问题讨论】:
是否要创建下载链接并让用户下载文件? 是的下载链接,但创建下载链接不是主要问题,我如何转换字符串“Hello World!”在 expressjs 中响应文本文件。 尝试使用socket.io并将txt文件作为socket消息发送,而不是依赖req-res模块 问题是你如何创建那个txt文件。 【参考方案1】:我想我明白你想要做什么。您想将 .txt 文件发送到客户端,而无需在光盘上实际创建文件。
这实际上非常基本,而且非常简单。您所要做的就是在标题中设置您的 MIME 类型,但是大多数浏览器默认不会下载 .txt 文件。他们只是打开并显示内容。
var text="hello.txt":"Hello World!","bye.txt":"Goodbye Cruel World!";
app.get('/files/:name',function(req,res)
res.set("Content-Disposition":"attachment; filename=\"req.params.name\"");
res.send(text[req.params.name]);
);
作为将来的说明,您可以发送存储为变量的任何数据。例如,如果您有一个加载了图像的缓冲区,您可以通过更改Content-Type
以相同的方式发送,否则浏览器不知道您正在发送什么数据,并且我相信将默认类型设置为text/html
。这里有一个很好的参考Internet Media Types and MIME types。
【讨论】:
"Content-Disposition":"attachment; filename=\"Hello.txt\""
会有所帮助,但仅限于某些浏览器。
嘿,谢谢你,你说得对,我想你的答案几乎就在那里,除了我也想命名文件。
如果此答案解决了您的问题,您能否将其标记为解决方案?
我认为 Content-type 也应该指定。一些浏览器(如 safari)会在文件名中添加 .html 扩展名。就我而言,我设置:res.set('Content-Disposition': 'attachment; filename=2015.csv','Content-type': 'text/csv');
这行得通。未来的小提示,我发现有必要在文件名周围包含双引号,例如res.set('Content-Disposition': 'attachment; filename=\"2015.csv\"','Content-type': 'text/csv');
【参考方案2】:
试试这个:
router.get('/download', (req, res) =>
var text = 'Hello world!'
res.attachment('filename.txt')
res.type('txt')
res.send(text)
)
【讨论】:
【参考方案3】:这对我有用!
var text="hello world";
res.setHeader('Content-type', "application/octet-stream");
res.setHeader('Content-disposition', 'attachment; filename=file.txt');
res.send(text);
【讨论】:
【参考方案4】:感谢大家的帮助,这就是我最终得到的结果: @aaron,有没有一种方法可以在所有浏览器中工作?
res.setHeader('Content-disposition', 'attachment; filename=theDocument.txt');
res.setHeader('Content-type', 'text/plain');
res.charset = 'UTF-8';
res.write("Hello, world");
res.end();
【讨论】:
您指定使用的是 express。如果您要使用 express,我建议您实际使用它。你在做的是纯 node.js以上是关于在 node.js 中从字符串创建一个文本文件并将其作为响应流式传输的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Node JS 中读取文本文件并将其作为 JSON 对象返回?
如何使用 Node.js 通过 ffmpeg 流式传输 MP4 文件?