9

paperclipファイルのアップロードに使用していました。以下の検証を使用します。

validates_attachment_content_type :upload, :content_type=>['application/pdf'], :if => Proc.new { |module_file| !module_file.upload_file_name.blank? }, :message => "must be in '.pdf' format"

しかし、私のクライアントは今日、アップロードできないと不満を漏らしましたpdf。調査した結果、リクエスト ヘッダーから、送信されたファイルにcontent_type=application/octet-stream.

許可application/octet-streamすると、多くの種類のファイルのアップロードが許可されます。

これに対処する解決策を提案してください。

4

3 に答える 3

7

ペーパークリップがコンテンツ タイプを正しく検出していないようです。カスタムコンテンツタイプの検出と検証(モデル内のコード)を使用して修正できた方法は次のとおりです。

VALID_CONTENT_TYPES = ["application/zip", "application/x-zip", "application/x-zip-compressed", "application/pdf", "application/x-pdf"]

before_validation(:on => :create) do |file|
  if file.media_content_type == 'application/octet-stream'
    mime_type = MIME::Types.type_for(file.media_file_name)    
    file.media_content_type = mime_type.first.content_type if mime_type.first
  end
end

validate :attachment_content_type

def attachment_content_type
  errors.add(:media, "type is not allowed") unless VALID_CONTENT_TYPES.include?(self.media_content_type)
end
于 2011-08-09T17:22:51.860 に答える
5

上記に基づいて、PaperClip 4.2およびRails 4と互換性のある最終的なものは次のとおりです。

before_post_process on: :create do    
  if media_content_type == 'application/octet-stream'
    mime_type = MIME::Types.type_for(media_file_name) 
    self.media_content_type = mime_type.first.to_s if mime_type.first  
  end
end
于 2015-02-25T20:13:42.917 に答える
3

paperclip 3.3 と Rails 3 では、これを少し異なる方法で行いました。

before_validation on: :create do   
  if media_content_type == 'application/octet-stream'
    mime_type = MIME::Types.type_for(media_file_name) 
    self.media_content_type = mime_type.first if mime_type.first  
  end
end

validates_attachment :media, content_type: { content_type: VALID_CONTENT_TYPES } 

ちなみに、これを行う必要があったのは、attach_file を使用した Capybara と phantom js でのテストで、一部のファイルに対して正しい MIME タイプが生成されなかったからです。

于 2012-12-16T08:32:21.413 に答える