Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 4.2, Paperclip gem. Failing to attach .docx type, reads content_type as 'application/zip' despite MIME type being registered

I've registered a MIME Type to allow Paperclip to read a .docx file's content_type as application/vnd.openxmlformats-officedocument.wordprocessingml.document.

However in tests the content_type is still being read as application/zip.

Any idea why? To make things more frustrating, the .pptx and .xlsx mime types have been registered, those tests pass (urgh).

config/initializers/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

app/models/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

Thanks for the help.

Edit:

As per the link provided by bkunzi01 I tried the following code. It had no effect, .docx files still fail validation whilst .pptx and .xlsx pass.

config/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'
    }
like image 330
Patrick Quigley Avatar asked Jul 27 '17 10:07

Patrick Quigley


1 Answers

It appears that the new version of paperclip was causing this issue. Downgrading to version 4.3.1 should resolve your issue

like image 192
richi Avatar answered Sep 17 '22 14:09

richi