Node.js-仅出于获取文件长度的目的将文件流保存到磁盘是否可以接受?

时间:2018-09-01 21:50:14

标签: node.js

我的后端运行着多个Node.js服务器。一个是API服务器,它可以接受来自第三方的图像文件。图像文件将流式传输到ImageMagick进程的标准输入,然后将ImageMagick进程的标准输出流式传输到Node.js TCP服务器,最终将文件保存在本地。文件成功保存后,TCP服务器随后需要向API服务器发送响应,因此我需要某种方式让TCP服务器知道何时具有整个文件(即,我不能简单地关闭API上的套接字发送文件后进入服务器)。

我可以使用的一种解决方案是将ImageMagick进程的标准输出保存到API服务器上的临时文件中,这样我就可以在发送完整文件之前获得其完整长度,并将其嵌入到流的开头。不过,向磁盘写入会在系统中带来一些麻烦。

是否可以将临时文件写入磁盘以获取文件的长度,还是有更好/更有效的方法来解决此问题?

谢谢

2 个答案:

答案 0 :(得分:0)

我不知道这是否相关。但是ImageMagick的miff:格式是流式格式。因此,您可以在通过miff:再次流式传输图像时,将图像的尺寸写入文本文件。

convert rose: miff:- | convert - -format "%wx%h" -write info:tmp.txt miff:-

在这里,我使用convert rose: miff:-模拟您的输入流。

然后,我将其传送到下一个转换,该转换读取输入流,并将WxH信息写入tmp.txt文本文件,您可以随后访问该文件。第二个转换还会创建miff:-输出流。

您可以使用NetPBM格式代替miff,因为它也是一种流格式。

答案 1 :(得分:0)

万一遇到其他类似问题,我找到了另一种解决方案,避免了完全指定文件大小。

使用{allowHalfOpen:true}选项创建TCP服务器。客户端可以将文件发送到TCP服务器,然后只需在套接字上调用“ end”方法即可表示该客户端将不再写入任何数据(该套接字仍可供客户端读取)。通过在服务器上设置“ allowHalfOpen”选项,服务器可以简单地侦听“ end”事件(这表示已接收到所有数据),而服务器的可写侧仍处于打开状态(允许服务器发送)回复给客户)。

请注意,“ allowHalfOpen”选项默认为false。如果未设置此选项,则关闭客户端的可写端后,服务器会自动关闭套接字。

例如

服务器

const fs = require('fs');
const net = require('net');
const server = net.createServer({allowHalfOpen: true});

server.on('connection', (socket) => {
    const writeStream = fs.createWriteStream('myFile.png');

    socket.on('data', (chunk) => {
        writeStream.write(chunk);
    });

    socket.on('end', () => {
        writeStream.end();
        socket.end('File Written To Disk'); // send response and close socket
    });
});

server.listen(8000);

客户

const fs = require('fs');
const net = require('net');

const socket = net.connect(8000);

fs.createReadStream('myFile.png').pipe(socket);

socket.on('data', (chunk) => {
    // response from TCP server
    console.log(chunk.toString()); // File Written To Disk
});

socket.on('end', () => {
    // server closed socket
});