Paperclip:在运行时选择在本地或 S3 中保存文件

Paperclip: Choose between saving files local or S3 at runtime

我正在使用 Paperclip 保存文件。我已成功配置 Paperclip 将文件直接保存到 Amazon S3。但在某些情况下,我只需要将文件保存在本地。我的问题是:我该怎么做。

这是我的回形针配置示例:

Paperclip.interpolates(:upload_url) { |attachment, style| "#{ENV.fetch('UPLOAD_PROTOCOL', 'http')}://#{ENV.fetch('UPLOAD_DOMAIN', 'localhost:3000')}/uploads/:class/:attachment/:id_:style.:extension" }

Paperclip::Attachment.default_options.merge!(
    storage: :s3,
    s3_region: ENV['CEPH_REGION'],
    s3_protocol: 'http',
    s3_host_name: ENV['CEPH_HOST_NAME'],
    s3_credentials: {
        access_key_id: ENV['CEPH_ACCESS_KEY_ID'],
        secret_access_key: ENV['CEPH_SECRET_KEY'],
    },

    s3_options: {
        endpoint: ENV['CEPH_END_POINT'],
        force_path_style: true
    },

    s3_permissions: 'public-read',

    bucket: ENV['CEPH_BUCKET'],
    url: ':s3_path_url',
    path: ':class/:id/:basename.:extension',

    use_timestamp: false
)

module Paperclip
  def self.string_to_io(options)
    data = StringIO.new(options[:data])
    data.class.class_eval{ attr_accessor :original_filename }
    data.original_filename = options[:original_file_name]
    data
  end
end

您可以使用 lambda。如图所示。 https://github.com/thoughtbot/paperclip#dynamic-configuration

看起来像这样。

class YOURMODEL < ActiveRecord::Base
  has_attached_file :FILE, storage: lambda { |attachment| (attachment.instance.use_s3? ? :s3 : :filesystem) }
end

然后您必须向您的模型添加一个方法 use_s3? 以检查您是想将文件存储在本地还是使用 s3。