Rails 4.2,Paperclip gem。如果未附加.docx类型,请将content_type读作' application / zip'尽管MIME类型已注册

时间:2017-07-27 10:50:47

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip

我已注册MIME类型,以允许Paperclip将.docx文件的content_type读为application/vnd.openxmlformats-officedocument.wordprocessingml.document

但是在测试中,content_type仍被视为application/zip

知道为什么吗?为了让事情更令人沮丧,.pptx.xlsx mime类型已经已经注册,这些测试通过了(urgh)。

配置/初始化/ mime_types.rb

Mime::Type.register 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', :docx
Mime::Type.register 'application/vnd.openxmlformats-officedocument.presentationml.presentation', :pptx
Mime::Type.register 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :xlsx

应用/模型/ attachment.rb

class Attachment < ActiveRecord::Base
  include FormatFile

  # Constants:
  VALID_FILE_NAMES = [/[^a-z0-9\-]+/i].freeze
  VALID_IMAGE_TYPES = %w[image/jpeg image/jpg image/png image/x-icon image/bnp].freeze
  VALID_CONTENT_TYPES = %w[
    image/jpeg
    image/jpg
    image/gif
    image/png
    image/bmp
    image/x-icon
    text/plain
    text/csv
    application/xml
    application/pdf
    application/msword
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
    application/vnd.openxmlformats-officedocument.wordprocessingml.template
    application/vnd.ms-word.document.macroEnabled.12
    application/vnd.ms-word.template.macroEnabled.12
    application/vnd.ms-excel
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    application/vnd.openxmlformats-officedocument.spreadsheetml.template
    application/vnd.ms-excel.sheet.macroEnabled.12
    application/vnd.ms-excel.template.macroEnabled.12
    application/vnd.ms-excel.addin.macroEnabled.12
    application/vnd.ms-excel.sheet.binary.macroEnabled.12
    application/vnd.ms-powerpoint
    application/vnd.openxmlformats-officedocument.presentationml.presentation
    application/vnd.openxmlformats-officedocument.presentationml.template
    application/vnd.openxmlformats-officedocument.presentationml.slideshow
    application/vnd.ms-powerpoint.addin.macroEnabled.12
    application/vnd.ms-powerpoint.presentation.macroEnabled.12
    application/vnd.ms-powerpoint.template.macroEnabled.12
    application/vnd.ms-powerpoint.slideshow.macroEnabled.12
  ].freeze

  # Associations:
  belongs_to :attachable, polymorphic: true

  # Paperclip attachments
  has_attached_file :attachment,
                    styles:      {
                      medium:   ['300x300#', :png],
                      thumb:    ['100x100#', :png],
                      original: ['500x500>', :png]
                    },
                    default_url: '/images/:style/missing.png',
                    url:         '/system/:class/:attachment/:id_partition/:style/:hash.:extension',
                    path:        ':rails_root/public:url',
                    hash_secret: '623629947a471569fe9808ab386f6e866abde5f582485beaa24fa12032b28a21b6ee94c018fe531484bb438a7376d4a00b4bc35598de34c01f0e40b1dbb37df5'

  # Validations:
  validates_attachment  :attachment,
                        content_type: {content_type: VALID_CONTENT_TYPES},
                        file_name:    {matches: VALID_FILE_NAMES},
                        size:         {in: 0..5.megabytes}
  validates_with AttachmentPresenceValidator, attributes: :attachment

  # Callbacks:
  before_post_process :skip_all_non_images
  before_validation do
    sanitize_filename attachment_file_name
  end

  # Don't shrink and create different styles for anything which isn't an image
  def skip_all_non_images
    VALID_IMAGE_TYPES.include?(attachment_content_type)
  end
end

感谢您的帮助。

修改

根据bkunzi01提供的链接,我尝试了以下代码。它没有任何效果,.docx文件在.pptx.xlsx通过时仍未通过验证。

配置/ application.rb中

  Paperclip.options[:content_type_mappings] = {
      docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
      xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    }

1 个答案:

答案 0 :(得分:2)

新版纸夹似乎导致了这个问题。降级到版本4.3.1应该可以解决您的问题