2011-08-02 9 views
9

Estaba usando paperclip para subir archivos. con validaciones como abajo:Paperclip: validar pdfs con content_type = 'application/octet-stream'

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"

Pero, mi cliente se quejó hoy que no es capaz de cargar pdf. Después de investigar, llegué a saber de los encabezados de solicitud que el archivo que se envió tenía content_type=application/octet-stream.

Permitir application/octet-stream permitirá la carga de muchos tipos de archivos.

Por favor, sugiera una solución para hacer frente a esto.

Respuesta

7

Parece que paperclip no detecta el tipo de contenido correctamente. Así es como yo era capaz de solucionarlo utilizando detección personalizada de tipo de contenido y validación (código de modelo):

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 
3

Por clip 3.3 y Rails 3, lo hice un poco diferente

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 } 

Por cierto, tuve que hacer esto porque probar con Capybara y phantom js usando attach_file no generó el tipo de mime correcto para algunos archivos.

+0

He descubierto que para evitar el procesamiento de un archivo con el tipo MIME incorrecta tuve que usar esto como un método before_file_post_process. –

5

base en lo anterior, esto es lo que terminé con el que es compatible con PaperClip 4.2 y los carriles 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 
Cuestiones relacionadas