2011-11-11 8 views
3

私のレールアプリは、Office 2007のドキュメント(pptx、xlsx、docx)の識別に問題があります。それはapplication/zip mime-typeでpaperclip経由でアップロードされます。Rails 3 paperclip mime type - Office 2007

私のシステム(OSX Lion)でもファイルがzipとして検出されているようです。

[email protected]:~$ file --mime -b test.docx 
application/zip; charset=binary 

私は私の初期化子/ mime_types

Rack::Mime::MIME_TYPES.merge!({ 
    ".docx"  => "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
}) 

しかし、運を持つに以下を追加しようとしました。

アイデア?

答えて

1

これはブラウザによって異なります。 MIMEタイプは、ブラウザによってコンテンツタイプとして設定されます。これは、ブラウザの実装と、クライアントマシンに存在する可能性のあるクライアント側MIMEタイプの設定によって異なります。

私は、ドキュメントタイプのチェックは、MIMEタイプ(コンテンツタイプ)だけでは信頼できないという結論に達しました。 MIMEタイプとファイル拡張子のチェックが必要です。ファイル拡張子だけではそれほど信頼性がありませんが、両方の組み合わせがおそらく合理的に実行可能になる可能性があります。

悲しいことに、Paperclipはファイル拡張子による検証をサポートしていないようですので、カスタムコードが必要です。ここで私はカスタム検証として思い付いたものです:

VALID_UPLOAD_FILE_CONTENT_TYPESVALID_UPLOAD_FILE_EXTENSIONSは、我々は初期化子で定義された2つの配列です
has_attached_file :file, ... 

validate :mime_type_or_file_extension 

private 
def mime_type_or_file_extension 
    if self.file.present? && 
    !VALID_UPLOAD_FILE_CONTENT_TYPES.include?(self.file_content_type) && 
    !VALID_UPLOAD_FILE_EXTENSIONS.include?(Pathname.new(self.file_file_name).extname[1..-1]) 
    self.errors.add(:file_file_name, "must be one of ." + VALID_UPLOAD_FILE_EXTENSIONS.join(' .')) 
    end 
end 

。私たちの添付ファイルは「ファイル」と呼ばれます

おそらく、このようなものがプルリクエストとしてPaperclip gemに追加される可能性があります。私は時間を見つけるかどうかわかります。

更新(2011/12/23) @Jamsiがダウンロードについて尋ねました。 @uploadは、私たちのファイル(ペーパークリップ)オブジェクトである

response.headers['Content-Disposition'] = "attachment; filename=#{@upload.file_file_name}" 
    response.headers['Content-Type'] = Rack::Mime.mime_type(File.extname(@upload.file_file_name)) 

:私たちはそうのように、コントローラにレスポンスヘッダのContent-処分とのContent-Typeを設定します。

+0

ありがとうございます。それは検証時に処理されます。ダウンロード時にContent-Dispositionを変更するのはどうですか? (Docxファイルは私のために.zipファイルとしてダウンロードします) – Jamsi

+0

@Jamsiようこそ。答えが好きな人は、それを受け入れてください(左の大きなチェックマークを押してください)。これは両方のスコアに役立ちます。[faq#評判]を参照してください。ダウンロードに関しては、コメントフィールドのコードを適切に書式設定できないため、答えを更新しています。 –