我的后端运行着多个Node.js服务器。一个是API服务器,它可以接受来自第三方的图像文件。图像文件将流式传输到ImageMagick进程的标准输入,然后将ImageMagick进程的标准输出流式传输到Node.js TCP服务器,最终将文件保存在本地。文件成功保存后,TCP服务器随后需要向API服务器发送响应,因此我需要某种方式让TCP服务器知道何时具有整个文件(即,我不能简单地关闭API上的套接字发送文件后进入服务器)。
我可以使用的一种解决方案是将ImageMagick进程的标准输出保存到API服务器上的临时文件中,这样我就可以在发送完整文件之前获得其完整长度,并将其嵌入到流的开头。不过,向磁盘写入会在系统中带来一些麻烦。
是否可以将临时文件写入磁盘以获取文件的长度,还是有更好/更有效的方法来解决此问题?
谢谢
答案 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
});