当尝试从 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 标准输出读取这些数据的正确方法是什么?
最佳答案
最初的方法有两个问题。
maxBuffer 需要足够高以处理来自子进程的整个响应。
二进制编码需要在各处正确设置。
一个完整的工作示例如下:
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/