You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Sails.js中动态生成文件并直接发送的技术问题咨询

搞定Sails.js动态生成文件直接发送的需求

嘿,我明白你想不用存服务器,直接把动态生成的内容作为文件发给客户端的需求,你之前的问题主要是对res.attachment()的用法理解错啦,它可不是用来传文件内容的,我来给你捋清楚怎么弄:

问题出在哪?

你原来的代码里,res.attachment(data, 'fileName.txt')是错的——res.attachment()的参数只有可选的文件名,它的作用是告诉浏览器“把这个响应当成附件下载”,同时设置好对应的响应头,根本不接收文件内容。这就导致浏览器把你的data字符串当成了文件名,所以下载的文件叫"data",再加上你后面的res.send()没传内容,自然文件是空的。

正确的实现代码

只需要把res.attachment()res.send()配合起来用就行,完全不用存文件:

function(req, res, next) {
  var name = req.param('name');
  var data = 'Welcome Mr/Mrs ' + name;
  
  // 第一步:设置要下载的文件名,这会自动配置Content-Disposition响应头
  res.attachment('fileName.txt');
  // 第二步:设置内容类型(可选,但推荐明确指定,避免浏览器识别错误)
  res.set('Content-Type', 'text/plain');
  // 第三步:把动态生成的内容发出去
  res.send(data);
}

另一种手动设置响应头的方式

如果你不想用res.attachment(),也可以手动写响应头,效果完全一样:

function(req, res, next) {
  var name = req.param('name');
  var data = 'Welcome Mr/Mrs ' + name;
  
  res.set({
    'Content-Type': 'text/plain',
    // 直接指定附件和文件名,注意文件名的引号是规范要求
    'Content-Disposition': 'attachment; filename="fileName.txt"'
  });
  
  res.send(data);
}

额外小提示

如果以后要生成其他格式的内容(比如CSV、JSON),只需要修改Content-Type就行:

  • CSV用text/csv
  • JSON用application/json
  • 要是有非英文的字符,记得确保内容编码正确,必要时可以加Content-Encoding: utf-8的响应头。

内容的提问来源于stack exchange,提问作者Ryan de Kock

火山引擎 最新活动