2011-12-16 73 views
1

我上傳圖片使用jquery上傳到亞馬遜s3,我使用Ruby Gems carrierwave和fog使它工作...但我想要做的是當我上傳圖像到s3,即使上傳的原始img文件大小爲3mb或更大,由carrierwave生成的將存儲在亞馬遜S3中的圖像也不應該大於500kb。圖像處理Rails Carrierwave到亞馬遜S3

基本上我不想控制和限制最終圖像的文件大小。

還有1件事我應該怎麼做,如果我不想跟蹤我的文件在Amazon S3中的高度和寬度。即我不想將這些圖像的WxH保存到數據庫中,這樣如果我需要它的話我會有一些參考。

任何評論,想法或建議都非常受歡迎。

謝謝。

回答

2

一個很好的使用方式是將文件直接上傳到Amazon s3,然後從該位置將其添加到您的應用程序中並與Carrierwave進行通信。如果您將文件存儲在s3上的臨時存儲桶/位置,則可以使載波有效地處理並移動它。它直接上傳到S3後,並假設你有可用的桶和解決您上傳它,你可以使用這樣的代碼有Carrierwave把它撿起來,對它進行處理,而「動」吧:

def add_file_from_URL(bucket, object_address) 
    s3 = AWS::S3::new 
    bucket = s3.buckets[bucket] 
    object = bucket.objects[object_address] 
    object_url = object.url_for(:read, :expires => 60*60, :secure => true) #expires in 1 hour 
    self.remote_attachment_url = object_url.to_s 
    self.save 
    object.delete() 
    end 

這段代碼將會在您的模型中包含文件。

我遺漏了處理(調整大小)文件的代碼,因爲如果您尚未完成該部分,您應該能夠輕鬆地在Carrierwave文檔中找到它。

爲了跟蹤文件的元數據,我建議使用:before_save回調函數將這些信息存儲在文件的邊上。你將有一個這樣的方法:

private 
    def update_file_attributes 
     if file.present? 
     self.file_content_type = attachment.file.content_type 
     self.file_size = attachment.file.size 
     end 
    end 

在這個例子中,我節省了實際的文件大小,但你可以調整這個維度來代替。這用於保存文件的模型中。