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

应该可以。