Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 您可以在不知道其扩展名的情况下从S3请求对象吗?_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services 您可以在不知道其扩展名的情况下从S3请求对象吗?

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存储桶,这样我们就可以请求存储桶中图像的更小或裁剪

假设我有一个名为uploads的bucket,它有两个目录,两个目录都包含图像

  • 第一个目录名为
    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、 g
    GET/kitten
    获取
    /kitten.jpg
    。当然,这不是现成的,因为S3中的键没有语义意义。获取一个保存时没有扩展名的对象,是的,这是因为
    内容类型和/或应用于有效负载的浏览器试探法起作用的。我明白了。。。在这种情况下,重定向规则也将不起作用,所以我会考虑lambda函数来生成具有扩展和MIME类型的适当图像。你有这些
    uploads/catalog/some image.jpg
    uploads/brands/extensionless image
    但是你想请求第一个作为
    uploads/catalog/some image
    ?@AdrianLynch,是的,这是正确的。是的,反向代理的想法很有趣,但正如你所说,在找到正确的对象之前,可能不值得花费(可能)多次往返的额外时间。我喜欢你提到的Lambda的想法。