es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

CarrierWave / MiniMagick no actualiza la extensión del archivo después de convertirlo.

Estoy usando MiniMagick con CarrierWave para procesar algunas imágenes en una aplicación de Rails 5.2. Mi objetivo es convertir la imagen original a jpg y crear otras dos versiones (redimensionadas).

Mi problema es que mientras que las “versiones” se procesan correctamente, el archivo original se convierte pero su extensión no se actualiza a .jpg. Por ejemplo, si paso esta imagen a través de mi cargador de archivos, obtendré las siguientes tres imágenes: placeholder-image.png, large_placeholder-image.jpg y thumb_placeholder-image.jpg (observa cómo la primera imagen, que es la original, aún tiene una extensión .png).

No puedo entender por qué ocurre esto, cualquier ayuda sería apreciada.

Código a continuación:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process convert: 'jpg'

  version :large do
    process resize_to_fit: [2000, 2000]
  end

  version :thumb do
    process resize_to_fit: [500, nil]
  end
end

También intenté esto, resultando en el mismo problema:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  version :jpg do
    process convert: 'jpg'
  end

  version :large, from_version: :jpg do
    process resize_to_fit: [2000, 2000]
  end

  version :thumb, from_version: :jpg do
    process resize_to_fit: [500, nil]
  end
end
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la línea process convert: 'jpg' del código del uploader. Está convirtiendo la imagen original al formato JPG, pero no está actualizando la extensión del archivo.

    Para solucionar este problema, puedes utilizar el método extension proporcionado por CarrierWave para actualizar la extensión del archivo original. Aquí te mostramos cómo puedes modificar tu código para lograr esto:

    class PhotoUploader < CarrierWave::Uploader::Base
      include CarrierWave::MiniMagick
    
      process convert: 'jpg'
      process :set_content_type
    
      version :large do
        process resize_to_fit: [2000, 2000]
      end
    
      version :thumb do
        process resize_to_fit: [500, nil]
      end
    
      def set_content_type
        # actualizar el tipo de contenido para evitar errores de "formato de archivo incorrecto"
        if file.content_type != 'image/jpeg'
          file.content_type = 'image/jpeg'
        end
      end
    
      def filename
        # anular el método filename para actualizar la extensión del archivo original
        "#{super.chomp(File.extname(super))}.jpg" if original_filename.present?
      end
    end
    

    En este código modificado, hemos agregado un método set_content_type que actualiza el tipo de contenido del archivo a JPEG. Esto es necesario para evitar errores de “formato de archivo incorrecto” que pueden ocurrir cuando la extensión del archivo no coincide con el formato real.

    También hemos anulado el método filename para actualizar la extensión del archivo original a .jpg. Esto debería solucionar el problema que experimentabas con la actualización de la extensión del archivo.

    ¡Espero que esto te ayude!

Comments are closed.