2017-04-10 4 views
0

파일 저장을 위해 Paperclip을 사용하고 있습니다. Amazon S3에 직접 파일을 저장하는 Paperclip을 성공적으로 구성했습니다. 그러나 어떤 경우에는 파일을 로컬에서만 저장해야합니다. 내 질문은 : 어떻게해야합니까?종이 클립 : 런타임에 로컬 또는 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 
+0

아래에 답변을 달았습니다. 호기심 때문에 왜이 작업을 수행하려고합니까? – nzajt

답변

1

당신은 람다를 사용할 수 있습니다

은 여기 내 예를 들어 종이 클립 구성입니다. 여기에 표시된대로. 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 

그럼 당신은 로컬 또는 S3로 파일을 저장하고 싶었 있는지 확인하는 모델에 방법 use_s3?를 추가해야합니다.

+0

예외 :'Paperclip :: Errors :: StorageMethodNotFound'를 만났습니다. 이유를 아십니까? –

+0

또한': storage => : filesystem'을 시도하지만 작동하지 않는 것 같습니다. –