使用AWS S3进行照片存储

7

我将使用S3存储用户上传的照片。显然,未经缩小调整,我不会向用户代理提供图像文件。但是,并非所有缩略图都应该是同一大小,因为有些缩略图比其他更大的预览图要小。所以,我考虑制作一个标准尺寸的系列,从最低16x16缩放到一些最高1024x1024。这是解决这个问题的好方法吗?如果以后需要新的尺寸,怎么办?你会如何解决?

2个回答

14

如果你知道需要哪些不同的尺寸,并且对于所有图像都会使用所有尺寸,而且图像和尺寸数量不多,存储成本不高,那么预先生成不同大小并将它们存储在S3中是一个很好的方法。

以下是另一种方法,当我不想为每个图像预先生成和存储所有不同的尺寸,或者当我不知道未来会使用哪些尺寸时,我会使用这种方法:

  1. 将原始尺寸存储在S3中。

  2. 运行一个可以根据请求从原始图像生成任何所需尺寸的Web服务器。

  3. 在Web服务器前添加CDN(CloudFront)。

现在,您的网站或应用程序可以从CloudFront请求像/16x16/someimage.jpg这样的URL。第一次发生这种情况时,CloudFront将从您的Web服务器获取调整大小的图像,然后CloudFront将缓存该图像并为您提供服务,极大地减少了命中您的Web服务器的流量。

以下是一个可以调整大小任意URL图像并通过CloudFront提供服务的服务:http://filter.to


我的动态调整大小脚本是否可以响应301 HTTP代码和一个指向AWS S3 URI的位置标头,并且我的图像HTML元素仍然可以正确加载资源? - Sam
重定向将减少每个请求对服务器的负载,但我认为它不会被CloudFront缓存,因此您的服务器仍然需要处理所有请求。 - Eric Hammond
我现在会进行重定向,一旦/如果我决定使用CloudFront,就会直接提供服务。 - Sam
那么当这种情况发生时,调整大小后的图像是留在服务器上还是S3存储桶中?如果图像驻留在Cloudfront上,是否可以/应该从Web服务器中删除图像?否则,似乎服务器会很快填满图像... - bentedder
@bentedder:如果您想节省下一次CloudFront请求时的一些CPU,可以将生成的图像缓存在服务器或S3上,但除此之外,ClodFront通常直接从终端点缓存中提供服务。 - Eric Hammond
显示剩余2条评论

0

这听起来是一个不错的方法。根据您的应用程序,您应该定义一组缩略图大小,您始终要生成。但也要存储原始用户文件,以防您的要求稍后更改。当您想要添加新的缩略图大小时,您可以遍历所有原始文件,并从中生成新的缩略图。这个选项为您提供了后续的灵活性。


没错,我在考虑给每张照片一个唯一的哈希值作为S3中的文件夹,然后存储original.png和128.png、256.png等。如果我需要新的尺寸或裁剪版本或任何其他图像转换,我总是可以迭代原始的original.png。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接