【问题标题】:Activestorage: get S3 key (not Rails blob key)Activestorage:获取 S3 密钥(不是 Rails blob 密钥)
【发布时间】:2019-10-01 01:06:13
【问题描述】:

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

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

我有什么选择?

【问题讨论】:

  • 如果微服务需要多个 API 密钥,可以考虑在 API 请求的 POST 正文中传递,但这也是一个安全隐患。你不能在微服务中将 API 密钥设置为 ENV var 吗?
  • 抱歉,不是访问密钥,是指特定文件的密钥,即bucket/folder/image.jpg
  • 是的,您肯定会传入 POST 正文或 GET 参数。如果微服务也可以访问数据库并且它也是一个 RoR 应用程序,您还可以将端点配置为已经与 ActiveStorage 对象相关。
  • 它具有 S3 访问权限,但它不是 Rails 应用程序。我只需要 Rails 方法来公开 S3 上的任何文件密钥。
  • 我想这就是你要找的东西? stackoverflow.com/a/49803251/891359

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


【解决方案1】:

使用service_url 不仅是大材小用,如果您尝试在ActiveStorage 控制器as described here 之外使用它也会遇到问题。

ActiveStorage#key 更好,对于 S3,它将将 S3 密钥返回给您的对象。它仍然不是您应该用于公共价值的东西 - ActiveStorage#signed_id 为您提供了 railsy 密钥。但是,如果您想要原始 S3 密钥(就像我对服务 API 所做的那样),key 可以工作并且不会在控制器之外抱怨。

所以在你的情况下:

def logo_key_on_s3
  logo.key
end

应该可以。

【讨论】:

  • 你说得对,我在寻找文件名作为密钥时一定尝试过。干杯。
  • 我以为这个键是为了别的东西,但它是用ActiveStorage替换s3的文件夹路径。太好了!
【解决方案2】:

因此,虽然@bo-oz 确实链接到了有用的讨论,但它并没有真正回答问题,因此,要检索文件在 S3 上存储的密钥:

class User < ApplicationRecord
  has_one_attached :logo

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

这只是生成一个服务 URL 并去除所有访问令牌、过期等,这是我所需要的,因为微服务已经具有存储桶访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多