2011-07-16 63 views
1

我正在使用rails Spreadsheet gem(http://spreadsheet.rubyforge.org/GUIDE_txt.html)將excel數據導入到我的應用程序中。Ruby On Rails電子表格 - 驗證文件類型

我能得到的Excel文件上傳罰款及用途:

書= Spreadsheet.open文件路徑

打開文件

此工作正常,如果該文件是一個有效的Excel文件,但如果我的用戶決定上傳隨機圖像文件或別的東西來代替,我得到這個錯誤:

OLE2簽名無效

這是可以理解的。

我無法在任何地方找到驗證文件的方法,然後再打開它。我寧願不通過文件擴展名來完成,如果我可以幫助它,沒有人知道在我打開它之前通過內容類型驗證文件的方法嗎?

鉭,喬

+2

爲什麼不通過*打開來驗證*,並用開始/救援/結束程序段捕獲錯誤? –

+0

對不起,只是注意到了這個評論,這就是我最終做的!謝謝:) – g33kette

回答

2

有許多方法來驗證文件類型,其中大部分是但通過檢查文件擴展名。

如果你不想這樣做,你可以訪問「文件」命令,你可以試試這個:

class File 
    def type_from_file_command 
    type = (self.original_filename.match(/\.(\w+)$/)[1] rescue "octet-stream").downcase 
    mime_type = `file -b --mime-type #{self.path}`.split(':').last.strip rescue "application/x-#{type}" 
    mime_type = "application/x-#{type}" if mime_type.match(/\(.*?\)/) 
    mime_type 
    end 
end 

ruby-1.9.2-p290 :030 > a = File.open("/path/nube_minilogo.psd") 
=> #<File:/path/nube_minilogo.psd> 
ruby-1.9.2-p290 :031 > a.type_from_file_command 
=> "image/vnd.adobe.photoshop" 

從回形針改編。

+0

這樣做的一個更好的方法是有一個條件方法,它將打開文件進行流式處理,並在獲得mimetype後關閉管道,如果它不符合預期的。 :) – coreyward

+0

啊,我很新的鐵軌和你的答案提醒我「救援」,這實際上解決了我的問題,因爲我想要做的是確保它沒有失敗,如果電子表格試圖打開一個無效的文件類型。 開始 書= Spreadsheet.open文件路徑 //處理電子表格 救援 //人爲錯誤消息 結束 – g33kette

+0

謝謝您的幫助! – g33kette