所以我想做的是从网址中流式传输图像,用graphicsmagick处理并将其流式传输到s3。我只是不工作。
将处理后的图像流式传输到本地磁盘(使用fs.createWriteStream)可以正常工作。
当我缓冲流时,s3中的最终图像至少具有预期的大小(以kb为单位),但是我无法打开该图像。
那就是我当前的进度:
var request = require('request'); var gm = require("gm"); var AWS = require('aws-sdk'); var mime = require('mime'); var s3 = new AWS.S3(); gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") .resize("100^", "100^") .stream(function(err, stdout, stderr) { var str = ''; stdout.on('data', function(data) { str += data; }); stdout.on('end', function(data) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: new Buffer(str, 'binary'), // thats where im probably wrong ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); }); });
我确实尝试了一些诸如创建filewritestream和filereadstream的工作,但是我认为应该有一些更清洁的解决方案来解决该问题…
编辑:我尝试的第一件事是将Body设置为stdout(来自@AndyD的建议答案):
var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: stdout, ContentType: mime.lookup("my-image.jpg") };
但是返回以下错误:
Cannot determine length of [object Object]'
编辑2:
完整的错误:
{ [Error: Cannot determine length of [object Object]] message: 'Cannot determine length of [object Object]', object: { _handle: { writeQueueSize: 0, owner: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, errorEmitted: false, bytesRead: 0, _bytesDispatched: 0, allowHalfOpen: undefined, writable: false, readable: true, _paused: false, _events: { close: [Function], error: [Function: handlerr] } }, name: 'Error' }
您不需要自己读取流(在您的情况下,由于var str =’‘,您似乎正在从二进制转换为字符串然后返回),然后附加作为二进制缓冲区的数据等。
尝试让putObject像这样通过流传输流:
gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") .resize("100^", "100^") .stream(function(err, stdout, stderr) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: stdout ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); }); });
有关更多信息,请参见这些发行说明。
如果流/管道不起作用,则可能会发生类似这样的情况,将所有内容加载到内存中然后上载。在这种情况下,我认为您只能使用4Mb。
var buf = new Buffer(''); stdout.on('data', function(data) { buf = Buffer.concat([buf, data]); }); stdout.on('end', function(data) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: buf, ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); });