我正在使用Activestorage。我想检索S3密钥以移交给微服务。我不想在Rails应用程序中下载Blob或类似的东西,我只想在API请求中提供文件路径/密钥。
service_url
实在是太过分了,因为我已经可以访问微服务中的存储桶,更不用说这些都是大文件了,而且我不需要不必要地传输它们。
我有什么选择?
答案 0 :(得分:1)
使用service_url
不仅过高,而且如果您尝试在ActiveStorage控制器as described here之外使用它,也会遇到问题。
更好的是ActiveStorage#key,对于S3,它会向您的对象返回 just 。仍然不是您应该用于公共值的用途-ActiveStorage#signed_id
为您提供了混乱的钥匙。但是,如果您想要原始的S3密钥(就像我对服务API所做的那样),key
可以正常工作,并且不会在控制器外部发出抱怨。
所以在您的情况下:
def logo_key_on_s3
logo.key
end
应该工作。
答案 1 :(得分:0)
因此,尽管@ bo-oz确实链接了有用的讨论,但并没有真正回答问题,因此,要检索文件存储在S3上的密钥:
class User < ApplicationRecord
has_one_attached :logo
def logo_key_on_s3
logo&.service_url&.split('?')&.first
end
end
这只是生成一个服务URL并剥离所有访问令牌,有效期等,这是我所需要的,因为微服务已经具有存储桶访问权限。要记住的重要一点是,Activestorage会混淆文件名,从而使文件名更难追踪。