2012-05-04 33 views
2

我們的用戶有兩種上傳圖片的方式。一個是通過一個簡單的HTML表單,另一個是通過名爲Aurigma的iPhone應用程序。我們使用Paperclip處理圖像並將它們存儲在S3上。使用Aurigma上傳的圖像最終具有錯誤的內容類型,導致它們作爲應用程序打開。如何解決Aurigma上傳到S3的內容類型?

我試過兩種解決方案:

before_save :set_content_type 

def set_content_type 
    self.image.instance_write(:content_type,"image/png") 
end 

和:

before_post_process :set_content_type 

def set_content_type 
    self.image.instance_write(:content_type, MIME::Types.type_for(self.image_file_name).to_s) 
end 

看來,如果這兩種解決方案被忽略。

使用回形針版本3.0.2,Aurigma版本1.3和我從iPhone上傳截圖。這是我的回形針配置:

has_attached_file :image, { 
    :convert_options => { :all => '-auto-orient' }, 
    :styles => { 
    :iphone3 => "150x150", 
    :web => "300x300" 
    }, 
    :storage => :s3, 
    :bucket => ENV['S3_BUCKET'], 
    :s3_credentials => { 
     :access_key_id => ENV['S3_KEY'], 
     :secret_access_key => ENV['S3_SECRET'] 
    }, 
    :path => "/pictures/:id/:style.:extension", 
    :url => "/pictures/:id/:style.:extension"} 
} 

回答

0

我只是回答了similar question

您需要對其自身進行復制或使用具有查詢字符串中指定的內容類型的預簽名url。

使用AWS SDK爲Ruby和url_for

object = bucket.objects.myobject 
url = object.url_for(:read, :response_content_type => "image/png") 
+0

謝謝,但我不知道如何實現這一點。我只是將我的Paperclip配置添加到我的問題中。回形針處理與S3的交互,所以我不知道要訪問存儲桶並找到我的對象。 或者你是否建議我直接訪問S3寶石桶,以某種方式檢索圖像,然後修改內容類型? –

+0

@SjorsProvoost - 要清楚我不是一個紅寶石開發人員,所以你必須填寫空白...當上傳文件,你設置內容類型使用Aurigma或Paperclip - 我會驚訝,如果兩個didn沒有選擇來設置這個。它看起來像Paperclip基於擴展名設置它,但這可能有助於覆蓋它,如果有必要:http://stackoverflow.com/questions/2581157/overriding-content-type-for-rails-paperclip-plugin。否則,我會直接使用AWS SDK將S3中的文件(自身)複製並設置正確的「內容類型」。 –

+0

或使用ASW SDK生成您在網站上使用的網址,並在url中設置「content-type」。這不會改變S3上設置的內容,而只是以不同的內容類型來提供文件。我懷疑回形針可能有選擇爲你做這個...對不起,我不能更具體。 –

0

據我瞭解你首先從客戶端設備中的所有文件上傳到自己的服務器(通過Aurigma上),然後將這些文件上傳到亞馬遜S3。我有類似的問題試圖改變客戶端設備上的內容類型。這不可能。您應該在服務器上發送文件,然後在將文件上傳到S3之前更改內容類型。

相關問題