Node.js-是否可以仅为了获取文件长度而将文件流保存到磁盘?

Node.js-是否可以仅为了获取文件长度而将文件流保存到磁盘?,node.js,Node.js,我有多个Node.js服务器在我的后端运行。一个是API服务器,它可以接受来自第三方的图像文件。图像文件流式传输到ImageMagick进程的stdin,然后ImageMagick进程的stdout流式传输到Node.js TCP服务器,文件最终保存在本地。然后,TCP服务器需要在成功保存文件后向API服务器发送响应,因此我需要一些方法让TCP服务器知道它何时拥有整个文件(即,在发送文件后,我不能简单地关闭API服务器上的套接字) 我可以使用的一个解决方案是将ImageMagick进程的stdo

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

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

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


谢谢

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

convert rose: miff:- | convert - -format "%wx%h" -write info:tmp.txt miff:-
这里我使用
convert-rose:miff:-
来模拟输入流

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


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

如果其他有类似问题的人发现了这一点,我找到了另一种解决方案,它可以避免完全指定文件大小

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

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

e、 g

服务器

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
});

为什么来自imagemagick处理的流不足以向TCP服务器发送一个信号,表明它拥有所有数据?imagemagick处理在API服务器上。Node.js TCP服务器位于单独的物理服务器上,用于静态内容(仅用于保存文件,然后与API服务器通信)。为了澄清这一点,ImageMagick流通过API服务器,而不是直接到TCP服务器。如果ImageMagic输出流式传输到API服务器,则无法提前获得大小(至少我不知道)。但这是用户上传的,不是吗?在第一个实际文件数据包到达之前,第一个服务器应该已经知道它将接收多少字节:这个数字应该已经是
内容长度
头,因为您的服务器需要能够判断客户端传输是否中断(过早或错误地发送坏数据等)。记录那个数字并转发?是的,我考虑过这样做,但是图像文件可能非常大,很多图像可以一次处理,所以我尝试通过节点流式传输所有内容以减少内存占用。我想我可能已经找到了一个非常简单的解决方法,它避免了完全指定图像大小的需要。我正在玩弄它,如果成功了,我会发布一个更新。谢谢,我不熟悉miff,但听起来我需要提供信息。是否有方法获取输出文件的大小,或者更确切地说,将输出文件的大小注入到输出流的开头(例如,输出流的前4个字节包含文件大小,或者类似的内容)?对不起,我刚刚注意到我的问题中的歧义。通过“大小”,我指的是图像的大小(以字节为单位),而不是图像的尺寸。将文件大小的
%wx%h
更改为
%b
。我不知道如何将其注入流中。我对流式数据知之甚少。我花了更多的时间阅读miff,它实际上在文件的开头嵌入了元数据(这正是我试图做的),但听起来它主要是直接用于ImageMagick。我可以将图像输出流化为miff,但随后我必须自己从流中解析大小和图像二进制。无论如何,谢谢你的建议。这是一个正确的想法,但我不认为它适用于我的特定场景。您可以以二进制或ascii格式以NetPBM格式进行流式传输。这是一种在所有Linux发行版上都可以找到的非常简单的格式。查看和