当前位置: 首页 > 面试题库 >

流使用aws-sdk将经过gm调整大小的图像上传到s3

徐涵亮
2023-03-14
问题内容

所以我想做的是从网址中流式传输图像,用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:

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

问题答案:

您不需要自己读取流(在您的情况下,由于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");
      });
    });


 类似资料:
  • 问题内容: 我正在尝试将调整大小的图像上传到S3: 但我得到一个错误: 问题答案: 您需要先将输出图像转换为一组字节,然后才能上载到s3。您可以将图像写入文件然后上传文件,也可以使用cStringIO对象来避免写入磁盘,就像我在这里所做的那样:

  • 问题内容: 我在教授的申请中使用的是查看学生名单的位置,其中将包含照片和其他详细信息以及删除选项。我试图仔细做的所有事情。但是存在一个问题,即来自Firebase的照片无法加载到。有时它会加载一两张照片,然后停止加载照片。我正在加载应用程序时观察android Studio上的“运行”选项。然后我发现类似… 为什么这个问题发生在我身上,我真的还没有。拜托,帮我摆脱这个问题。 在寻找了很多东西之后,

  • 问题内容: 我有一个快速的问题,我不太确定要进行设置。我在其他地方看到过示例,但没有什么比我的情况更具体。我想使用PHP调整图像的大小,以使图像易于阅​​读,而不仅仅是像使用HTML那样随意拉伸。如果它们的宽度不是250像素,也不是160像素,那么如何调整图片的大小,使其成比例但适合该空间? 谢谢! 问题答案: 好的,下面是我在商店中使用的Image对象。保持规模-需要GD 我在请求时调整图像的大

  • 我已经成功上传图像到我的数据库,但现在我需要我添加的每个图像的缩略图。我似乎无法调整大小和存储图像作为一个单独的文件在我的webroot/img/缩略图文件夹。 我需要上传一个文件,在后端它应该裁剪/调整图像大小,并将该图像以及原始图像存储在数据库中。下面是我在表单上按submit时的控制器功能。 没有错误。它只是不保存到数据库

  • 问题内容: 我一直在搜索google,只遇到过降低高度/宽度或通过CoreImage如何编辑UIImage外观的库。但是我还没有看到或找到一个库,这篇文章解释了如何减小图像大小,因此在上载时,它不是完整的图像大小。 到目前为止,我有这个: 并且正在发送12MB的照片。如何将其减小到1mb?谢谢! 问题答案: Xcode 9•Swift 4或更高版本 编辑/更新:对于iOS10 +,我们可以使用UI

  • 问题内容: 我发现了一些不同的帖子,甚至关于stackoverflow的问题都回答了这个问题。我基本上正在实现与此职位相同的事情。 所以这是我的问题。上传照片时,我还需要提交表单的其余部分。这是我的html: 以前,我不需要调整图像大小,因此我的JavaScript看起来像这样: 所有这些都很好用…现在我需要调整图像的大小…如何替换表单中的图像,以便发布调整大小的图像而不是上传的图像? 我曾考虑过