代码之家  ›  专栏  ›  技术社区  ›  froglegs

节点.js-仅仅为了获得文件长度而将文件流保存到磁盘是否可以接受?

  •  0
  • froglegs  · 技术社区  · 8 年前

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

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

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   froglegs    8 年前

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

    使用{allowHalfOpen:true}选项创建TCP服务器。客户端可以将文件发送到TCP服务器,然后简单地调用socket上的“end”方法,表示客户端将不再写入数据(客户端仍然可以读取socket)。通过在服务器上设置“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
    });
    
        2
  •  0
  •   fmw42    8 年前

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

    我用这个 convert rose: miff:-

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

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

    推荐文章