2014-04-17 71 views
4

我試圖使用回形針4.1.1將CSV文件附加到Rails3模型,但我無法獲取S3報告的內容類型爲text/csv(而不是text/plain)。當我隨後從S3下載文件時,擴展名將被更改爲匹配內容類型,而不是保留原始擴展名(因此test.csv將作爲test.txt下載)。通過回形針4連接時,在S3中設置內容類型?

從我所看到的,當您上傳文件時,FileAdapter將緩存創建時的內容類型以及由ContentTypeDetector(其調用file -b --mime filename)確定的任何值。不幸的是,CSV文件返回text/plain這是有道理的,因爲你如何真正區分這一點?嘗試使用attachment.instance_write(:content_type, 'text/csv')設置內容類型只設置模型中的值,不影響寫入S3的內容類型。

FileAdapter的CONTENT_TYPE這裏初始化:https://github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/io_adapters/file_adapter.rb#L14

呼叫創建將io_adapter: https://github.com/thoughtbot/paperclip/blob/v4.0/lib/paperclip/attachment.rb#L98

我真的有一個通用的上傳在這裏(所以我不能硬編碼在S3頭定義的內容類型在has_attached_file),我並不是真的想要內容類型的欺騙保護。任何想法/建議?我寧願不降級到3.5,因爲這將意味着只是延緩了痛苦,但如果這是唯一的辦法,我就自娛自樂吧...

+1

是否使用透霧S3或S3爲您的存儲供應商?您可以將一個lambda傳遞給s3_headers以確定是否應該覆蓋content_type值,但霧實現沒有等效值:fog_headers選項... – stereoscott

+0

@stereoscott如果我通過Fog使用S3,是否有其他方法重寫標題? –

+0

@charinten希望我的答案可以幫助你。 – stereoscott

回答

6

如果您正在使用fog那麼你可以做這樣的事情:

has_attached_file :report, 
    fog_file: lambda { |attachment| 
    { 
     content_type: 'text/csv', 
     content_disposition: "attachment; filename=#{attachment.original_filename}", 
    } 
    } 

如果您正在使用亞馬遜S3爲您的存儲提供者,那麼這樣的事情應該工作:

has_attached_file :report 
    s3_headers: lambda { |attachment| 
    { 
     'Content-Type' => 'text/csv', 
     'Content-Disposition' => "attachment; filename=#{attachment.original_filename}", 
    } 
    } 
+0

在你的設置中,你的意思是說我們只能上傳'text/csv'?其他格式呢? –

+0

@charinten你可以設置任何你想要的格式。 – stereoscott

+0

我認爲你在'Content-Disposition'行結尾處有一個額外的逗號。如果在霧中使用s3,s3_headers部分可以正常工作。 – FuzzyJulz

相關問題