无法使用 Rails Active Storage 从 S3 检索文件

nav*_*avi 5 ruby-on-rails amazon-s3 rails-activestorage

我正在尝试使用 Rails Active Storage 将照片上传到 S3。

我可以附上照片:

user.photo.attach(io: File.open('spec/images/filename.png'), filename: 'filename.png')

我可以保存用户,并且可以获取照片服务 URL 并在浏览器和我的存储桶中查看它:

user.photo.service_url

但是,如果我重新启动控制台并尝试获取服务 url,我会收到以下错误:

Module::DelegationError (service_url delegated to attachment, but attachment is nil)

这是我的存储桶设置:

存储.yml:

amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: us-east-2
  bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>
Run Code Online (Sandbox Code Playgroud)

应用程序.rb:

config.active_storage.service = :amazon

用户.rb:

has_one_attached :photo

public: true我在 storage.yml 文件中使用时也遇到问题。

如果我尝试设置配置,我会收到以下错误:

ArgumentError (Cannot load `Rails.config.active_storage.service`:)
invalid configuration option `:public'
Run Code Online (Sandbox Code Playgroud)
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: us-east-2
  bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>
  public: true
Run Code Online (Sandbox Code Playgroud)

Tom*_*ast 4

我还想将我的文件上传到 AWS S3,并公开它们。

我也遇到了这个问题,发现如下:

ArgumentError (Cannot load `Rails.config.active_storage.service`:)
invalid configuration option `:public'
Run Code Online (Sandbox Code Playgroud)

来自gem中的这个文件aws-sdk-ruby。根据错误消息,aws-sdk-ruby gem 不支持该public: true选项。

我使用了以下解决方法(特别感谢这篇文章):

  1. 我将 storage.yml 更新为:
public_amazon:
  service: S3
  access_key_id: some_key
  secret_access_key: some_secret
  bucket: some-bucket-name
  region: some-region
  upload:
    acl: "public-read"
Run Code Online (Sandbox Code Playgroud)

以上设置上传文件权限为公开。

  1. 像这样检索公共 URL:
user.photo.attach(params[:file])
url = user.photo.service.send(:object_for, user.photo.key).public_url
Run Code Online (Sandbox Code Playgroud)