Amazon web services 您可以在不知道其扩展名的情况下从S3请求对象吗?
假设我有一个名为uploads的bucket,它有两个目录,两个目录都包含图像Amazon web services 您可以在不知道其扩展名的情况下从S3请求对象吗?,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,假设我有一个名为uploads的bucket,它有两个目录,两个目录都包含图像 第一个目录名为catalog,具有具有各种扩展名的图像(.jpg,.png,等等) 第二个目录名为brands,包含没有扩展名的图像 我可以请求uploads/catalog/some image.jpg和uploads/brands/extensionless image,它们都会像我期望的那样返回图像 我们已经在使用第三方服务,它只是一个图像处理CDN,链接到S3存储桶,这样我们就可以请求存储桶中图像的更小或裁剪
catalog
,具有具有各种扩展名的图像(.jpg
,.png
,等等)brands
,包含没有扩展名的图像uploads/catalog/some image.jpg
和uploads/brands/extensionless image
,它们都会像我期望的那样返回图像
我们已经在使用第三方服务,它只是一个图像处理CDN,链接到S3存储桶,这样我们就可以请求存储桶中图像的更小或裁剪版本
理想情况下,我希望将图像和对象保持在bucket中的当前格式,但我希望客户端不知道它请求的是哪个文件。换句话说,我想请求一些图像
,尽管它可能在bucket中有扩展名,也可能没有扩展名,但我仍然希望以某种方式“智能地猜测”我请求的图像。我们还将假设不存在冲突,即,永远不会有图像some image.jpg
和some image
具有相同名称(我们的对象使用无冲突算法命名)
这就是我尝试过的:
- 只需通过扩展名请求一个目录中的图像,而不使用扩展名请求另一个bucket中的图像(但是,即使策略与请求图像相同,该机制也必须以两种不同的方式实现。我希望使用单一的机制)
- 另一个解决方案是以编程方式从
中的所有映像中删除扩展,然后重新同步存储桶目录
以前有人碰到过类似的事情吗?想法?如果在对象元数据中正确设置了
内容类型
,则无论扩展名如何,您都应该没有问题。如果未设置内容类型
标题,您可以设置它,例如使用来发现图像类型并进行设置。我想您最好的选择是重命名图像。并不是说没有其他解决方案,而是因为这可能是最简单、最直接的方法
首先,S3不会猜测。从S3的角度来看,S3对象上的键是一个不透明的字符串。扩展没有任何意义,甚至分隔“目录”的斜杠对S3也没有内在意义。(在S3中删除“目录”意味着为目录中的每个对象发送一个删除请求。控制台通过这样做为您创建了一个方便的假象。)
S3有重定向规则,但它们只匹配和操作路径前缀,而不是后缀,因此没有帮助
可以在S3前面使用反向代理来检查请求,对于任何404或403,代理可以使用备用扩展重试请求,直到找到一个有效的扩展,并且可能“学习”正确的扩展以用于后续请求,但是,对于多个请求,您将有额外的周转时间和额外的成本
我开发了一些系统,其工作是通过尝试多个后端URL“查找”HTTP请求的内容,而请求者不知道后台正在进行的“搜索”,这可能非常有用。。。但是,这是一个比你可能要考虑的要复杂得多的解决方案,特别是考虑到当图像加载时每毫秒计数。p>
对于S3的魔术猜测,没有本机解决方案。你几乎要问它你到底想要什么。当然,S3中的存储足够便宜,您可以复制您的内容,包括扩展和不扩展,而无需过多考虑成本。如果在bucket上使用Lambda事件,甚至可以在每次修改“kitten.jpg”时自动将“kitten.jpg”复制到“kitten”。谢谢您的回答。但情况似乎并非如此。我有一个名为
1570
的对象,其内容类型为image/jpeg
。我可以请求https://s3.amazonaws.com///1570
,然后返回图像。但是,如果我请求https://s3.amazonaws.com///1570.jpg
(使用扩展名,它实际上不存在于对象上),我得到一个NoSuchKey
错误代码。我遗漏了什么吗?@Julio AWSEvangelist他正在试图请求一个文件(对象),该文件(对象)的密钥有扩展名,但没有在请求中指定扩展名。e、 gGET/kitten
获取/kitten.jpg
。当然,这不是现成的,因为S3中的键没有语义意义。获取一个保存时没有扩展名的对象,是的,这是因为内容类型和/或应用于有效负载的浏览器试探法起作用的。我明白了。。。在这种情况下,重定向规则也将不起作用,所以我会考虑lambda函数来生成具有扩展和MIME类型的适当图像。你有这些uploads/catalog/some image.jpg
和uploads/brands/extensionless image
但是你想请求第一个作为uploads/catalog/some image
?@AdrianLynch,是的,这是正确的。是的,反向代理的想法很有趣,但正如你所说,在找到正确的对象之前,可能不值得花费(可能)多次往返的额外时间。我喜欢你提到的Lambda的想法。