Activestorage:获取S3密钥(不是Rails Blob密钥)

时间:2019-05-14 04:34:31

标签: ruby-on-rails amazon-s3 ruby-on-rails-5 rails-activestorage

我正在使用Activestorage。我想检索S3密钥以移交给微服务。我不想在Rails应用程序中下载Blob或类似的东西,我只想在API请求中提供文件路径/密钥。

service_url实在是太过分了,因为我已经可以访问微服务中的存储桶,更不用说这些都是大文件了,而且我不需要不必要地传输它们。

我有什么选择?

2 个答案:

答案 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会混淆文件名,从而使文件名更难追踪。