使用aws-sdk将svresize的图像上传到s3

所以我想要做的是从一个URLstream图像,处理它与graphicsmagick和stream上传到S3。 我只是没有得到它的工作。

将处理后的图像stream式传输到本地磁盘(使用fs.createWriteStream)可以毫无问题地工作。

当我缓冲我的stream,s3中的最终图像至less有预期的大小(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"); }); }); }); 

我曾尝试一些东西,如创build一个filewritestream和filereadstream,但我认为应该有一些更清洁更好的解决scheme,以解决这个问题…

编辑:我尝试的第一件事是将身体设置为标准输出(来自@AndyD的build议答案):

 var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: stdout, ContentType: mime.lookup("my-image.jpg") }; 

但是,返回以下错误:

 Cannot determine length of [object Object]' 

EDIT2:

  • nodeversion:0.8.6(我也试过0.8.22和0.10.0)
  • aws-sdk:0.9.7-pre.8(今天安装)

完整的错误:

 { [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' } 

你不需要自己读取stream(在你的情况下,你似乎是从二进制转换为string,并返回由于var str ='',然后附加数据是一个二进制缓冲区等…

试着让putObjectpipe道像这样的stream:

 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"); }); }); }); 

有关更多信息,请参阅这些发行说明

如果streaming / pipe不起作用,那么类似这样的东西可能会将所有内容加载到内存中,然后上传。 在这种情况下,我认为你只限于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"); }); });