process - 从 Node.js 中的子进程读取二进制数据

标签 process node.js binary

当尝试从 ImageMagick 子进程读取 Node.js 中的数据时,结果已损坏。

一个简单的测试用例如下:

var fs = require('fs');
var exec = require('child_process').exec;

var cmd = 'convert ./test.jpg -';
exec(cmd, {encoding: 'binary', maxBuffer: 5000*1024}, function(error, stdout) {
  fs.writeFileSync('test2.jpg', stdout);
});

我希望这相当于命令行 convert ./test.jpg -> test2.jpg 可以正确写入二进制文件。

最初存在一个问题,即 maxBuffer 选项太小并导致文件被截断。增加之后,该文件现在看起来比预期的稍大并且仍然损坏。 来自标准输出的数据需要通过 HTTP 发送。

从 ImageMagick 标准输出读取这些数据的正确方法是什么?

最佳答案

最初的方法有两个问题。

  1. maxBuffer 需要足够高以处理来自子进程的整个响应。

  2. 二进制编码需要在各处正确设置。

一个完整的工作示例如下:

var fs = require('fs');
var exec = require('child_process').exec;

var cmd = 'convert ./test.jpg -';
exec(cmd, {encoding: 'binary', maxBuffer: 5000*1024}, function(error, stdout) {
  fs.writeFileSync('test2.jpg', stdout, 'binary');
});

另一个示例,使用 Express Web 框架在 HTTP 响应中发送数据,如下所示:

var express = require('express');
var app = express.createServer();

app.get('/myfile', function(req, res) {
  var cmd = 'convert ./test.jpg -';
  exec(cmd, {encoding: 'binary', maxBuffer: 5000*1024}, function(error, stdout) {
     res.send(new Buffer(stdout, 'binary'));
  });
});

关于process - 从 Node.js 中的子进程读取二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164095/

相关文章:

java - Runtime.getRuntime().exec() 导致 java.io.IOException : Cannot run program . .. 没有这样的文件或目录

javascript - HTML 内容更新未显示在 ionic 中

十六进制数可以用十进制数加减吗?

algorithm - 仅使用 O(lg β) 次乘法和除法将 β 位整数转换为数字数组

parsing - attoparsec 解析二进制文件格式的例子?

java - 如何让 ProcessBuilder 处理嵌套引号?

c# - 查找 Office 应用程序的现有实例

macos - 如何检测文本文件是否仍被 TextEdit 打开

node.js - 在 Jade 中,在脚本中无法包含工作

javascript - NodeJs + ExpressJS : router level middleware not able to take the request