将图像上传到S3,然后在node.js中调整大小

时间:2013-07-14 22:50:41

标签: image node.js image-processing amazon-s3 imagemagick

我正在建立一个网站,用户将上传图像,然后图像最终将存储在Amazon S3中。现在,考虑到可以直接从浏览器上传,我考虑了以下选项:

  1. 在浏览器中调整为所有三种尺寸,然后直接上传到S3 - 这样可行,但问题是我上传了多张图片,我怀疑这是一个很好的方法。
  2. 将原始图像上传到S3,在node.js中调整大小 - 我在考虑实际只上传原始图像,然后使用node.js调整大小。
  3. 最好的方法2)这样我就可以最小化我需要部署的服务的足迹。

    感谢任何指针!

    干杯 维沙尔

3 个答案:

答案 0 :(得分:4)

我不会选择1只是因为它对用户体验不利。

我建议如下:仅将原始图像上传到s3,然后当客户端请求调整大小的变体时,从s3检索它,调整大小,并通过CDN传递给客户端。

这可以让他们立刻调整大小,因为:

  • 也许您想稍后更改尺寸。根据要求调整大小可让您随意更改大小。否则,你必须浏览每个图像并重做所有调整大小。
  • 用户无需等到所有图像都调整大小。相反,用户只等待图像从node.js服务器上传到s3,这很快就假设你在aws上。
  • 立即调整大小会产生内存峰值。如果你在像heroku这样的低内存平台上,你可以很快达到512mb内存限制,你的应用程序会交换并变得非常慢。更好地分散调整大小的操作。
  • 您只在S3上存储原件。调整大小的版本只是衍生品 - 无需存储它们。

我写了一个库https://github.com/mgmtio/simgr来帮助我在我的应用中执行此操作。

答案 1 :(得分:1)

G'day Vishal,

我想你最大的图像会比你的小尺寸大得多,这可能是缩略图或其他什么。由于图像文件大小或多或少与图像的区域成比例,因此这种效果会更加明显。

因此,您创建的将S3中最大的图像拉回来重新缩放它的任何服务都可能使用比仅从客户端上传所有三个的版本更多的S3带宽!因此,做选项1可能更明智。

编辑:如果你真的想避免上传多个文件,我仍然不会使用upload-direct-to-S3选项,因为a)你必须检测新的文件S3和b)周围发送的数据总量仍然大于您将图像接受到节点应用程序中,在那里调整大小然后将各种大小保存到S3。

This question discusses image manipulation in Node.

-----尼克

答案 2 :(得分:0)

我建议使用Image CDN来加快图像传送速度。选中here

Amazon S3速度慢且图像太重

众所周知,直接提供Web内容时,Amazon S3运行缓慢。一 之所以慢,是因为一个桶只能放在一个桶中 地理位置。创建位置时已选择位置 桶。例如,如果您的存储桶是在以下位置的Amazon服务器上创建的 加利福尼亚,但是您的用户在印度,那么图像仍然会 来自加利福尼亚。此地理距离导致图像变慢 在您的网站上加载。

此外,在S3上看到非常沉重的图像, 尺寸和高字节大小。人们只能推测原因, 但这可能与发布工作流程和 S3作为存储空间的便利性。

使用ImageEngine之类的图像传送,同时保持S3的工作流程 和便利程度。

当我说它非常容易实现时,请相信我... 我非常重复。

创建帐户后进行必要的设置后,您所需要做的就是 使用ImageEngine域的参考图像

http://wq77sh2y.cdn.imgeng.in/path/image.jpg

使用前缀功能的参考图像

http://wq77sh2y.cdn.imgeng.in/http://example.com/path/image.jpeg