当前位置: 首页 > 知识库问答 >
问题:

节点。js发送文件作为响应

曾实
2023-03-14

Expressjs框架有一个sendfile()方法。如果不使用整个框架,我怎么能做到这一点?

我正在使用node-native-zip创建一个归档文件,并希望将其发送给用户

共有3个答案

牛华皓
2023-03-14

这对我有帮助。一旦您点击/your route路径,它就会开始下载文件。

app.get("/your-route", (req, res) => {

         let filePath = path.join(__dirname, "youe-file.whatever");

         res.download(filePath);
}

下载也是一种快捷方式。

莘康裕
2023-03-14

您需要使用流在响应中发送文件(存档),而且您还必须在响应头中使用适当的内容类型。

有一个示例函数可以做到这一点:

const fs = require('fs');

// Where fileName is name of the file and response is Node.js Reponse. 
responseFile = (fileName, response) => {
    const filePath = "/path/to/archive.rar"; // or any file format

    // Check if file specified by the filePath exists
    fs.exists(filePath, function (exists) {
        if (exists) {
            // Content-type is very interesting part that guarantee that
            // Web browser will handle response in an appropriate manner.
            response.writeHead(200, {
                "Content-Type": "application/octet-stream",
                "Content-Disposition": "attachment; filename=" + fileName
            });
            fs.createReadStream(filePath).pipe(response);
            return;
        }
        response.writeHead(400, { "Content-Type": "text/plain" });
        response.end("ERROR File does not exist");
    });
}

内容类型字段的目的是充分描述正文中包含的数据,以便接收用户代理可以选择适当的代理或机制向用户呈现数据,或者以适当的方式处理数据。

“应用程序/八位字节流”在RFC 2046中定义为“任意二进制数据”,这种内容类型的目的是保存到磁盘-这是您真正需要的。

"filename=[文件名]"指定要下载的文件名。

有关更多信息,请参阅此stackoverflow主题。

毛弘博
2023-03-14

下面是一个示例程序,它将发送myfile。通过从磁盘流式播放mp3(也就是说,在发送文件之前,它不会将整个文件读入内存)。服务器侦听端口2000。

[更新]正如@Aftershock在评论中提到的,util。泵消失了,用流原型上名为管道方法替换;下面的代码反映了这一点。

var http = require('http'),
    fileSystem = require('fs'),
    path = require('path');

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var stat = fileSystem.statSync(filePath);

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size
    });

    var readStream = fileSystem.createReadStream(filePath);
    // We replaced all the event handlers with a simple call to readStream.pipe()
    readStream.pipe(response);
})
.listen(2000);

取自http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/

 类似资料:
  • 问题内容: Expressjs框架具有sendfile()方法。我如何在不使用整个框架的情况下做到这一点。我正在使用node-native- zip创建档案,并将其发送给用户。 问题答案: 这是一个示例程序,它将通过从磁盘流式传输myfile.mp3来发送myfile.mp3(也就是说,在发送文件之前,它不会将整个文件读入内存)。服务器在端口2000上侦听。 [更新] 正如@Aftershock在

  • 剪辑过,我剪短了。 代码变量被赋值 首先需要用get请求触发php脚本,输出不应该保存 然后,当上面的请求完成后,将get请求发送到并将响应保存到一个变量, 对于https://flower.nyaizhel.ml/fun/carbon/shorturl.php?short&code=ii,它应该是6,请参阅url 我试着取,没有结果

  • 问题内容: 我有一个通过node.js运行的JS文件,因此通常我会打开一个终端窗口并输入类似内容,然后它会整天运行;好玩 然后,当我想重新启动它时,我按下Ctrl-c,然后退出。然后,我可以再次运行命令。 现在,我想做的是能够通过网页执行此操作,以便我的用户可以运行特定的JS文件,也可以“重新引导”它们。 因此有两个问题: 有可能,如果可以,我如何开始? 它安全吗?如果不安全,可以安全吗? 基于s

  • 我正在尝试使用原始JSON执行POST请求。 当预期的时候 不知道--为什么会这样?

  • 问题内容: 我在Google上搜索了此内容,但找不到答案,但这一定是一个常见问题。这是与Node request读取图像流-通过管道返回响)相同的问题,尚未得到答复。 如何发送图像文件作为Express .send()响应?我需要将RESTful网址映射到图片-但是如何发送带有正确标题的二进制文件?例如, 通话中… 问题答案: Express中有一个api。 http://expressjs.co

  • 问题内容: 我的要求是使用HTTP Servlet将PDF数据响应到移动客户端(iPhone)。 我是按照以下方式完成的,但是我没有在客户端获得预期的输出。 我遵循的方法正确吗?请指教。 谢谢。 问题答案: 您必须使用ServletOutputStream及其write()方法将字节写入response。