在 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 对象返回?

在Android中从/向文件读取/写入字符串

如何使用 Node.js 通过 ffmpeg 流式传输 MP4 文件?

使用 Node.js 将一行写入 .txt 文件

使用 Express 和 Node JS 在 MongoDB 中上传文本文件

在 Node JS 中从不同的“会话”读取/写入相同的文件内容是不是有风险?