啊,问题是:如果超时时间(timeout)大于0,则当子进程运行时间超过timeout毫秒时,它将被强制终止。子进程将使用killSignal(默认为'SIGTERM')被终止。maxBuffer指定了允许在stdout或stderr上的最大数据量 - 如果超出此值,则将终止子进程。
来源:
http://nodejs.org/docs/v0.4.8/api/child_processes.html#child_process.exec
因此,如果您的图像超过默认的缓冲区大小200*1024字节,那么您的图像将会像您提到的那样损坏。我能够使用以下代码使其正常工作:
var fs = require('fs');
var spawn = require('child_process').spawn;
var util = require('util');
var output_file = fs.createWriteStream('test2.jpg', {encoding: 'binary'});
var convert = spawn('convert', ['test.jpg', '-']);
convert.stdout.on('data', function(data) {
output_file.write(data);
});
convert.on('exit', function(code) {
output_file.end();
});
我使用spawn获取可流式输出,然后使用一个可写流以二进制格式写入数据。只是测试了一下,成功打开了生成的test2.jpg
图像。
编辑:是的,您可以使用此方法通过HTTP发送结果。以下是我使用convert缩小图像,然后将结果发布到glowfoto API的示例:
var fs = require('fs');
var http = require('http');
var util = require('util');
var spawn = require('child_process').spawn;
var url = require('url');
var xml = require('xml2js');
var post_url;
var input_filename = 'giant_image.jpg';
var output_filename = 'giant_image2.jpg';
function EncodeFieldPart(boundary,name,value) {
var return_part = "--" + boundary + "\r\n";
return_part += "Content-Disposition: form-data; name=\"" + name + "\"\r\n\r\n";
return_part += value + "\r\n";
return return_part;
}
function EncodeFilePart(boundary,type,name,filename) {
var return_part = "--" + boundary + "\r\n";
return_part += "Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + filename + "\"\r\n";
return_part += "Content-Type: " + type + "\r\n\r\n";
return return_part;
}
function PreparePost() {
var boundary = "---------------------------168072824752491622650073";
var post_data = '';
post_data += EncodeFieldPart(boundary, 'type', 'file');
post_data += EncodeFieldPart(boundary, 'thumbnail', '400');
post_data += EncodeFilePart(boundary, 'image/jpeg', 'image', output_filename);
fs.readFile(output_filename, 'binary', function(err,data){
post_data += data;
post_data += "\r\n--" + boundary + "--";
MakePost(new Buffer(post_data, 'binary'));
});
}
function MakePost(post_data) {
var parsed_url = url.parse(post_url);
var post_options = {
host: parsed_url.hostname,
port: '80',
path: parsed_url.pathname,
method: 'POST',
headers : {
'Content-Type' : 'multipart/form-data; boundary=---------------------------168072824752491622650073',
'Content-Length' : post_data.length
}
};
var post_request = http.request(post_options, function(response){
response.setEncoding('utf8');
response.on('data', function(chunk){
console.log(chunk);
});
});
post_request.write(post_data);
post_request.end();
}
function GetServerURL() {
var response = '';
var post_options = {
host: 'www.glowfoto.com',
port: '80',
path: '/getserverxml.php'
};
var post_req = http.request(post_options, function(res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
response += chunk;
});
res.on('end', function(){
var parser = new xml.Parser();
parser.addListener('end', function(result){
post_url = result.uploadform;
PreparePost();
});
var xml_object = parser.parseString(response);
});
});
post_req.end();
}
var convert = spawn('convert', ['-resize', '30%', input_filename, '-']);
var output_file = fs.createWriteStream(output_filename, {encoding: 'binary'});
convert.stdout.on('data', function(data){
output_file.write(data);
});
convert.on('exit', function(code){
output_file.end();
GetServerURL();
});
样例结果:
$ node test.js
<?xml version="1.0" encoding="utf-8"?>
<upload>
<thumburl>http://img4.glowfoto.com/images/2011/05/29-0939312591T.jpg</thumburl>
<imageurl>http://www.glowfoto.com/static_image/29-093931L/2591/jpg/05/2011/img4/glowfoto</imageurl>
<codes>http://www.glowfoto.com/getcode.php?srv=img4&img=29-093931L&t=jpg&rand=2591&m=05&y=2011</codes>
</upload>