Activestorage:获取 S3 密钥(不是 Rails blob 密钥)
Activestorage: get S3 key (not Rails blob key)
我正在使用 Activestorage。我想检索 S3 密钥以移交给微服务。我不想在 Rails 应用程序中下载 blob 或类似的东西,我只想在 API 请求中提供文件 path/key。
service_url
太过分了,因为我已经可以访问微服务中的存储桶,更不用说这些都是大文件,我不需要不必要地传输它们。
我有哪些选择?
因此,尽管@bo-oz 进行了 link 有益的讨论,但它并没有真正回答问题,因此,要检索文件存储在 S3 上的密钥:
class User < ApplicationRecord
has_one_attached :logo
def logo_key_on_s3
logo&.service_url&.split('?')&.first
end
end
这只会生成一个服务 URL 并去除所有访问令牌、到期时间等,这是我所需要的,因为微服务已经具有存储桶访问权限。
使用 service_url
不仅矫枉过正,如果您尝试在 ActiveStorage 控制器之外使用它也会遇到问题,as described here。
更好的是 ActiveStorage#key,对于 S3,return 只是 对象的 S3 键。它仍然不是您 应该 用于 public 值的东西 - ActiveStorage#signed_id
为您提供了 railsy 键。但是如果你想要原始的 S3 密钥(就像我为服务 API 所做的那样),key
可以工作并且不会在控制器之外抱怨。
所以在你的情况下:
def logo_key_on_s3
logo.key
end
应该可以。
我正在使用 Activestorage。我想检索 S3 密钥以移交给微服务。我不想在 Rails 应用程序中下载 blob 或类似的东西,我只想在 API 请求中提供文件 path/key。
service_url
太过分了,因为我已经可以访问微服务中的存储桶,更不用说这些都是大文件,我不需要不必要地传输它们。
我有哪些选择?
因此,尽管@bo-oz 进行了 link 有益的讨论,但它并没有真正回答问题,因此,要检索文件存储在 S3 上的密钥:
class User < ApplicationRecord
has_one_attached :logo
def logo_key_on_s3
logo&.service_url&.split('?')&.first
end
end
这只会生成一个服务 URL 并去除所有访问令牌、到期时间等,这是我所需要的,因为微服务已经具有存储桶访问权限。
使用 service_url
不仅矫枉过正,如果您尝试在 ActiveStorage 控制器之外使用它也会遇到问题,as described here。
更好的是 ActiveStorage#key,对于 S3,return 只是 对象的 S3 键。它仍然不是您 应该 用于 public 值的东西 - ActiveStorage#signed_id
为您提供了 railsy 键。但是如果你想要原始的 S3 密钥(就像我为服务 API 所做的那样),key
可以工作并且不会在控制器之外抱怨。
所以在你的情况下:
def logo_key_on_s3
logo.key
end
应该可以。