活动存储: 获取S3密钥(而非Rails blob密钥)

3
我正在使用Activestorage。我想检索S3密钥以交给微服务。我不想在Rails应用程序中下载blob或任何类似的东西,我只想在API请求中提供文件路径/密钥。
因为我已经可以访问微服务中的桶,而且这些是大型文件,我不需要不必要地传输它们,所以service_url有点过于复杂了。
我的选择是什么?
"最初的回答"

如果你需要多个微服务的API密钥,可以考虑将其作为API请求的POST主体传递,但这也存在安全风险。难道你不能将API密钥设置为微服务的环境变量吗? - undefined
抱歉,不是访问密钥,而是指向特定文件的键,即bucket/folder/image.jpg - undefined
是的,你肯定会将它传递给POST请求体或GET参数。如果微服务还可以访问数据库,并且也是一个RoR应用程序,你还可以配置端点,使其与ActiveStorage对象相关联。 - undefined
它具有S3访问权限,但不是一个Rails应用程序。我只需要使用Rails方法来暴露S3上的文件键。 - undefined
1
我觉得这就是你要找的东西吧?https://dev59.com/gVUL5IYBdhLWcg3wzarS#49803251 - undefined
显示剩余2条评论
2个回答

6

使用service_url不仅是过度设计,而且在尝试在ActiveStorage控制器之外使用它时会遇到问题,正如此处所述。

更好的解决方式是使用ActiveStorage#key,对于S3,它将仅返回对象的S3密钥。它仍然不是您应该用于公共值的“预期”方法 - ActiveStorage#signed_id将为您提供railsy键。但是,如果您想要原始的S3密钥(就像我为服务API所做的那样),则key可以工作,并且在控制器之外也不会出现错误。

因此,在您的情况下:

def logo_key_on_s3
  logo.key
end

应该可以正常工作。


1
你说得对,我肯定是在寻找以文件名为键时尝试过那个方法。谢谢。 - undefined
我以为这个键是用来做其他事情的,但它实际上是ActiveStorage替换文件夹路径到S3的一个方法。太棒了! - undefined

1
因此,虽然@bo-oz提供了有用的讨论链接,但它并没有真正回答问题,所以要检索存储在S3上的文件的密钥:
class User < ApplicationRecord
  has_one_attached :logo

  def logo_key_on_s3
    logo&.service_url&.split('?')&.first
  end
end

这只是生成一个服务URL,并剥离所有的访问令牌、过期时间等信息,因为微服务已经具有存储桶访问权限,所以这就是我所需要的。

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