流上传GM-尺寸调整的图像与AWS-SDK至S3(stream uploading an gm-re

2019-08-19 14:26发布

所以我想要做的是从URL流的图像,与实: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,但我认为应该有一些更清洁的更好的解决这一问题?

编辑:我想的第一件事就是身体设置为标准输出(从@AndyD建议的答案):

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

Answer 1:

你不需要阅读自己流(在你的情况下,你似乎是从二进制字符串转换回由于无功海峡=“”,然后将数据追加这是一个二进制缓存等等...

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


文章来源: stream uploading an gm-resized image to s3 with aws-sdk