假设我有一个名为uploads
的存储桶,其中包含两个目录,两个目录都包含图像。
名为catalog
的第一个目录包含各种扩展程序的图片(.jpg
,.png
等。
名为brands
的第二个目录包含 no 扩展名的图片。
我可以请求uploads/catalog/some-image.jpg
和uploads/brands/extensionless-image
,他们都会按照我的预期返回图片。
我们已经在使用第三方服务imgix,它只是一个链接到S3存储桶的图像处理CDN,因此我们可以请求更小或裁剪的版本桶中的图像。
理想情况下,我希望将图像和对象保留在当前格式的存储桶中,但我希望客户端不知道它正在请求哪个文件。换句话说,我想请求some-image
,即使它可能或者可能没有实际扩展,我仍然想以某种方式"智能地猜测" 34;我请求的图像。我们还假设 no collisions ,即永远不会有同名的图像some-image.jpg
和some-image
(我们的对象以无碰撞算法。
这是我尝试过的:
只需通过扩展程序在一个目录中请求图像,而在没有扩展名的情况下在另一个存储桶中请求图像(但是,即使策略与请求图像相同,该机制也必须以两种不同的方式实现方式。我想要一个单一的机制)
另一种解决方案是以编程方式从catalog
中的所有图片中删除扩展程序并重新同步存储桶
之前有人遇到过类似的事吗?想法?
答案 0 :(得分:2)
我怀疑你最好的选择是重命名图像。并不是说没有其他解决方案,但因为这可能是最简单,最直接的方法。
首先,S3不会猜测。从S3的角度来看,S3对象上的键是一个不透明的字符串。扩展名没有任何意义,甚至是大小写分隔"目录"对S3没有内在意义。 (删除"目录"在S3中意味着为目录中的每个单独对象发送删除请求。控制台通过为您执行此操作创建了一个方便的错觉。)
S3有重定向规则,但它们只匹配和操作路径前缀,而不是后缀,所以没有帮助。
使用S3前面的反向代理可以检查请求以及任何404或403,代理可以使用备用扩展重试请求,直到找到一个有效的,并且可能&# 34;学习"适用于后续请求的正确扩展程序,但随后您将获得额外的周转时间和多个请求的额外费用。
我开发的系统的工作是找到"通过尝试多个后端URL在HTTP上请求的内容,而请求者不知道"狩猎"在后台进行,它可能非常有用......但这是一个比你可能想要考虑的更复杂的解决方案,特别是考虑到图像加载时每毫秒都很重要的事实。
使用S3进行魔法猜测没有本机解决方案。你几乎要问它到底想要什么。当然,S3中的存储足够便宜,您可以复制您的内容,无论是否有扩展,而无需过多考虑成本。如果您在存储桶上使用了Lambda事件,您甚至可以自动执行复制过程" kitten.jpg"去小猫"每次" kitten.jpg"被修改了。
答案 1 :(得分:0)
如果在对象元数据中正确设置了content-type
,则无论扩展名如何,都应该没问题。如果未设置content-type
标头,您可以设置它,例如使用ImageMagick Identify发现图像类型,并AWS CLI进行设置。