3

我正在使用 ActiveStorage 上传 PDF 和图像。由于一些隐私问题,PDF 需要存储在本地,而图像需要使用 Amazon S3 存储。但是,ActiveStorage 似乎只支持为每个环境设置一种服务类型(除非您使用镜像功能,在这种情况下它不能满足我的需要)

有没有办法在同一环境中使用不同的服务配置?例如,如果一个模型has_one_attached pdf使用本地服务:

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

如果另一个模型has_one_attached image使用亚马逊服务:

amazon:
  service: S3
  access_key_id: ""
  secret_access_key: ""
4

3 回答 3

4

Rails 6.1 现在支持这一点。

根据本文,您可以service为每个指定要使用的attached

class MyModel < ApplicationRecord
  has_one_attached :private_document, service: :disk
  has_one_attached :public_document,  service: :s3
end
于 2020-08-25T20:47:16.717 回答
1

ActiveStorage 很棒,但是如果您在每个环境中都需要多种服务类型,那么它目前不适合您(正如上面提到的 George Claghorn)。如果您需要其他选项,我使用Shrine解决了这个问题。

诀窍是在初始化程序中设置多个“商店”:

# config/initializers/shrine.rb

Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new('storage', prefix: 'uploads/cache'),
  pdf_files: Shrine::Storage::FileSystem.new('storage', prefix: 'uploads'),
  images: Shrine::Storage::S3.new(**s3_options)
}

然后在每个上传器(您连接到给定模型)中使用default_storage插件。请注意,除非您在两个上传器中指定 default_storage,否则它将不起作用:

class PdfFileUploader < Shrine
  plugin :default_storage, cache: :cache, store: :pdf_files
end

class ImageFileUploader < Shrine
  plugin :default_storage, cache: :cache, store: :images
end
于 2018-05-31T16:45:55.613 回答
-1

抱歉,恐怕 Active Storage 不支持此功能。

于 2018-05-19T12:58:32.517 回答