2011-12-06 24 views
1

蔭嘗試添加Content-Disposition我的docx文件在S3中的docx。沿線的東西:Content-Disposition: attachment; filename="filename.docx"。我想這樣做是因爲IE(< 9)將docx文件下載爲zip文件。經過一些Google搜索後,我發現有一個解決方法,在內容中加入content-disposition。我嘗試使用before_post_process回電,做設置內容處置使用回形針

before_post_process :set_content_disposition 

def set_content_disposition 
    filename = self.attachment.instance.attachment_file_name 
    self.attachment.instance_write(:content_disposition, "attachment; filename="+filename) 
end 

但是,它仍然是下載的zip文件。有沒有辦法正確做到這一點。

回答

1

我終於找到了一種方法..有一個before_post_process回調紙夾寶石。

,我們可以做這樣的事情..

has_attached_file :sample 
before_post_process :set_content_dispositon 

def set_content_dispositon 
    self.sample.options.merge({:s3_headers => {"Content-Disposition" => "attachment; filename="+self.sample_file_name}}) 
end 
+0

這應該是'.merge' –

0

我不能幫你回形針但​​docx文件的正確MIME類型/內容類型application/vnd.openxmlformats-officedocument.wordprocessingml.document

使用,這將阻止IE瀏覽器下載他們的zip文件。

這裏是所有的MIME類型爲新的Office格式。

Extension MIME Type 
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template 
.potx application/vnd.openxmlformats-officedocument.presentationml.template 
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow 
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation 
.sldx application/vnd.openxmlformats-officedocument.presentationml.slide 
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document 
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template 
.xlam application/vnd.ms-excel.addin.macroEnabled.12 
.xlsb application/vnd.ms-excel.sheet.binary.macroEnabled.12 
+0

看看我的答案..你提到的SOLN是,當我們從我們的服務器提供文件服務。 –

+0

我很高興你有一個可行的解決方案,但你仍然在使用正確的'Content-Type'來存儲和提供來自S3的文件。 –

0

百憂解,

我認爲,在回形針你必須設置s3_header [「內容處置」]哈希,但我在同樣的問題,因爲s3_header哈希不插我仍然可以」牛逼弄清楚如何把文件名有沒有補丁回形針

檢查該解決方案http://groups.google.com/group/paperclip-plugin/browse_thread/thread/bff66a0672a3159b

+0

是的,你是right..Check了我的答案.. –

+0

偉大的發現百憂解,但我有一個稍微不同的情景,我有一個自定義的處理器,我想實現你在這裏作出迴應,但我不能,因爲似乎before_post_process如果您有自定義處理器,則無法運行。你有想法如何與定製處理器一起做? –

8

百憂解的回答(用before_post_process編輯選項),我沒有工作。但是,無論如何,現在有一個更簡單的方法。您可以直接通過一個進程到:在您的通話has_attached_file的選項哈希s3_headers鍵:

has_attached_file :attachment, { 
    ..., 
    :s3_headers => lambda { |attachment| 
    # pass whatever you want in place of "attachment.name" 
    { "Content-Disposition" => "attachment; filename=\"#{attachment.name}\"" } 
    }, 
    ... 
} 
+0

謝謝,非常小的評論,總有避免紅寶石逃脫的方式,例如這裏,即使你已經有了''',你仍然可以使用'%(附件;!文件名=」 #{attachment.name}「)' – ecoologic

+0

在最近的Paperclip中,這個過程似乎在附件填充之前運行。 '''{ 「ID」:空, 「document_file_name」:空, 「document_content_type」:空, 「document_file_size」:空, 「document_updated_at」:空, 「solution_id」:空 「USER_ID」:空, 「created_at」: null,「updated_at」:null}'''任何想法如何獲取附件詳細信息一旦設置,所以我可以動態設置內容處置? –