{"record":{"id":"551848df3cccfc74","repo":"carrierwaveuploader/carrierwave","slug":"errors-messages-processing-error-551848","errorCode":null,"errorMessage":"errors.messages.processing_error","messagePattern":"errors\\.messages\\.processing_error","errorType":"exception","errorClass":"CarrierWave::ProcessingError","httpStatus":null,"severity":"error","filePath":"lib/carrierwave/processing/rmagick.rb","lineNumber":401,"sourceCode":"        frame = yield(*[frame, index, options].take(block.arity)) if block_given?\n        frames << frame if frame\n      end\n      frames.append(true) if block_given?\n\n      write_block = create_info_block(options[:write])\n\n      if options[:format] || @format\n        frames.write(\"#{options[:format] || @format}:#{current_path}\", &write_block)\n        move_to = current_path.chomp(File.extname(current_path)) + \".#{options[:format] || @format}\"\n        file.content_type = Marcel::Magic.by_path(move_to).try(:type)\n        file.move_to(move_to, permissions, directory_permissions)\n      else\n        frames.write(current_path, &write_block)\n      end\n\n      destroy_image(frames)\n    rescue ::Magick::ImageMagickError\n      raise CarrierWave::ProcessingError, I18n.translate(:\"errors.messages.processing_error\")\n    end\n\n  private\n\n    def create_info_block(options)\n      return nil unless options\n      proc do |img|\n        options.each do |k, v|\n          if v.is_a?(String) && (matches = v.match(/^[\"'](.+)[\"']/))\n            CarrierWave.deprecator.warn \"Passing quoted strings like #{v} to #manipulate! is deprecated, pass them without quoting.\"\n            v = matches[1]\n          end\n          img.public_send(:\"#{k}=\", v)\n        end\n      end\n    end\n\n    def destroy_image(image)","sourceCodeStart":383,"sourceCodeEnd":419,"githubUrl":"https://github.com/carrierwaveuploader/carrierwave/blob/b5f0abe10ecf6500309fc83e0e8969cf57ba690e/lib/carrierwave/processing/rmagick.rb#L383-L419","documentation":"Raised as CarrierWave::ProcessingError by CarrierWave::RMagick#manipulate! when RMagick raises ::Magick::ImageMagickError while loading or writing frames — for example a corrupt image, an unsupported format, or a write to a format string like \"png:/path\". Unlike the MiniMagick variant, every ImageMagickError becomes the generic processing error; there is no re-raise for install problems.","triggerScenarios":"An uploader including CarrierWave::RMagick with process blocks (or a custom manipulate! block calling frames operations) where Magick::ImageList.read/read_inline fails on the input or frames.write fails — corrupt bytes, wrong extension, or an output format the ImageMagick build cannot encode.","commonSituations":"RMagick/ImageMagick version mismatches (RMagick compiled against ImageMagick 6 then the system upgrades to 7), memory-exhausting large images surfacing as ImageMagickError, and user-uploaded files that are not actually images.","solutions":["Validate the file is a readable image before processing (Marcel sniff or Magick::ImageList.read probe in a cache callback) and reject early","Rescue CarrierWave::ProcessingError where uploads are handled and return a validation error","Reinstall/recompile the rmagick gem against the installed ImageMagick (gem pristine rmagick) if errors happen for every image","Migrate from the deprecated RMagick engine to CarrierWave::MiniMagick or CarrierWave::Vips, which are maintained"],"exampleFix":"# before\nclass PhotoUploader < CarrierWave::Uploader::Base\n  include CarrierWave::RMagick\n  process resize_to_limit: [800, 800] # corrupt file -> ProcessingError\nend\n\n# after\nclass PhotoUploader < CarrierWave::Uploader::Base\n  include CarrierWave::RMagick\n  process resize_to_limit: [800, 800]\n\n  before_cache :verify_image!\n  def verify_image!(file)\n    Magick::ImageList.new(file.path).first\n  rescue Magick::ImageMagickError\n    raise CarrierWave::ProcessingError, :invalid_image\n  end\nend","handlingStrategy":"try-catch","validationCode":"def valid_rmagick_image?(path)\n  list = Magick::ImageList.new(path)\n  !list.empty? && list.columns > 0\nrescue Magick::ImageMagickError\n  false\nend","typeGuard":null,"tryCatchPattern":"begin\n  uploader.cache!(uploaded)\nrescue CarrierWave::ProcessingError\n  uploader.errors.add(:base, :processing_failed)\nend","preventionTips":["Probe files with Magick::ImageList.new(path) in a before_cache callback and reject on ImageMagickError","Recompile the rmagick gem after any ImageMagick system upgrade (gem pristine rmagick)","Plan migration off RMagick to MiniMagick/Vips — RMagick is deprecated and error surfaces are worse"],"tags":["carrierwave","rmagick","imagemagick","image-processing","upload"],"backgroundTag":"image-processing-failed","analyzedSha":"b5f0abe10ecf6500309fc83e0e8969cf57ba690e","analyzedAt":"2026-08-21T18:07:27.715Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}