2010-12-05 31 views
4

我想使用OpenURI從S3下載文件,然後將其保存在本地,以便我可以將該文件作爲附件與ActionMailer一起發送。爲什麼使用OpenURI將文件下載到部分文件中?

發生了一些奇怪的事情。正在下載和附加的圖像已損壞,圖像的底部部分丟失。

下面的代碼:

require 'open-uri' 
open("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}", "wb") do |file| 
    source_url = a.authenticated_url() 
    io = open(URI.parse(source_url).to_s) 
    file << io.read 
    attachments[a.attachment_file_name] = File.read("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}")   
end 

a是從的ActionMailer附件。

任何想法?我真的很感激你的想法,因爲我一直把頭撞在牆上。

回答

9

它看起來像是在文件關閉之前試圖讀取文件,這可能會導致部分文件緩衝區未被寫入。

我會做這樣的:

require 'open-uri' 

source_url = a.authenticated_url() 
attachment_file = "#{Rails.root.to_s}/tmp/#{a.attachment_file_name}" 
open(attachment_file, "wb") do |file| 
    file.print open(source_url, &:read) 
end 

attachments[a.attachment_file_name] = File.read(attachment_file) 

看起來source_url = a.authenticated_url()將是一個字符串,所以解析字符串轉換成URI然後做就可以了to_s將是多餘的,除非URI做一些正火,我不認爲它確實如此。

基於我的系統管理經驗:一項附帶任務是清理下載/假脫機文件。可以在連接後立即刪除它們,也可以每天運行一個cron作業,刪除一天之內的所有假脫機文件。

另外一個問題是,在無法讀取URL的情況下沒有錯誤處理,導致附件失敗。使用臨時假脫機文件你可以檢查文件的存在。更好的是,如果服務器返回400或500錯誤,則應該準備好處理異常。


要避免使用臨時假脫機文件試試這個未經測試的代碼:

require 'open-uri' 

source_url = a.authenticated_url() 
attachments[a.attachment_file_name] = open(source_url, &:read) 
+1

謝謝!你是否知道如何將ActionMailer附件作爲StringIO讀取?所以我不必使用臨時文件? – AnApprentice 2010-12-06 00:51:59

相關問題