2011-07-16 12 views
1

エクセルデータをアプリケーションにインポートするには、railsスプレッドシートgem(http://spreadsheet.rubyforge.org/GUIDE_txt.html)を使用しています。私は罰金と利用をアップロードするExcelファイルを取得することができますRuby On Railsスプレッドシート - ファイルタイプのバリデーション

:ファイルを開くために

ブック= Spreadsheet.open filePathに

ファイルが有効なExcelファイルである場合、これは正常に動作し、しかし、私のユーザーはランダムなイメージファイルまたは代わりに何か他のものをアップロードすることを決定した場合、私はこのエラーを取得:

OLE2署名が無効である

わかりやすい。

ファイルを開く前に、ファイルの検証方法を見つけることができません。私はそれを助けることができる場合、私はむしろファイル拡張子でそれをやっていないだろう誰も私がそれを開く前にコンテンツの種類でファイルを検証しようとする方法を知っていますか?

はTaを、ジョー

+2

* by * openingを検証せずに、begin/rescue/endブロックでエラーをトラップするのはなぜですか? –

+0

ああ申し訳ありませんが、このコメントに気づいただけで、私がやったことです!ありがとう:) – g33kette

答えて

2

ファイルタイプを検証するいくつかの方法がありますが、それらのほとんどは、しかし、ファイルの拡張子を確認することです。

あなたがそれを行うにはしたくない、あなたは「file」コマンドへのアクセス権を持っている場合は、この試すことができます:ペーパークリップから適応

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が無効なファイルタイプを開こうとした場合、 。 が ブック= Spreadsheet.open filePathに //プロセスのスプレッドシートを開始 救助 //ヒューマンエラーメッセージ エンド – g33kette

+0

はあなたの助けをありがとう! – g33kette