1

When I'm trying to upload watermark on s3 image through paperclip then it will give error like not authorised and missing an image filename because I'm using dynamic watermark URL. It is also stored in s3

photo.rb

has_attached_file :image,
                  :processors => lambda {|attachment|
                    if attachment.class.apply_watermark
                      [:thumbnail,:watermark]
                    else
                      [:thumbnail]
                    end
                  },
                  :styles => lambda { |attachment|
                    {
                      :medium => {
                        :geometry => "259x259#",
                        :watermark_path => attachment.instance.class.watermark_thumb_url,
                        :position => "SouthEast",
                        :s3_protocol => :https
                      },
                      :thumb => {
                        :geometry => Proc.new { |instance| instance.resize },
                      },
                      :original => {
                        :geometry => '1200>',
                      },
                    }
                  }, default_url: "https://s3_bucket_name.s3.ap-south-1.amazonaws.com/shared_photos/missing.png",
                  :s3_protocol => :https

lib/paperclip_processors/watermark.rb

  module Paperclip
    class Watermark < Processor
      # Handles watermarking of images that are uploaded.    
      attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options, :watermark_path, :overlay, :position

      def initialize file, options = {}, attachment = nil
         super
         geometry          = options[:geometry]
         @file             = file
         @crop             = geometry[-1,1] == '#'
         @target_geometry  = Geometry.parse geometry
         @current_geometry = Geometry.from_file @file
         @convert_options  = options[:convert_options]
         @whiny            = options[:whiny].nil? ? true : options[:whiny]
         @format           = options[:format]
         @watermark_path   = options[:watermark_path]
         @position         = options[:position].nil? ? "center" : options[:position]
         @overlay          = options[:overlay].nil? ? true : false
         @current_format   = File.extname(@file.path)
         @basename         = File.basename(@file.path, @current_format)
       end

       # Returns true if the +target_geometry+ is meant to crop.
        def crop?
          @crop
        end

        # Returns true if the image is meant to make use of additional convert options.
        def convert_options?
          not @convert_options.blank?
        end

        # Performs the conversion of the +file+ into a watermark. Returns the Tempfile
        # that contains the new image.
        def make
          dst = Tempfile.new([@basename, @format].compact.join("."))
          dst.binmode

          command = "convert"
          params = [fromfile]
          params += transformation_command
          params << tofile(dst)
          begin
            success = Paperclip.run(command, params.flatten.compact.collect{|e| "'#{e}'"}.join(" "))
          rescue PaperclipCommandLineError
            raise PaperclipError, "There was an error resizing and cropping #{@basename}" if @whiny
          end

          if watermark_path
            command = "composite"
            params = %W[-gravity #{@position} #{watermark_path} #{tofile(dst)}]

            params << tofile(dst)
            begin
              success = Paperclip.run(command, params.flatten.compact.collect{|e| "'#{e}'"}.join(" "))
            rescue PaperclipCommandLineError
              raise PaperclipError, "There was an error processing the watermark for #{@basename}" if @whiny
            end
          end

          dst
        end

        def fromfile
          File.expand_path(@file.path)
        end

        def tofile(destination)
          File.expand_path(destination.path)
        end

        def transformation_command
          scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
          trans = %W[-resize #{scale}]
          trans += %W[-crop #{crop} +repage] if crop
          trans << convert_options if convert_options?
          trans
        end
    end
  end

watermarks_controller.rb

def upload_watermark_on_dummy_image
  Photo.apply_watermark = true
  Photo.watermark_thumb_url = @watermark.photo.image.url(:thumb)
  current_resource_owner.photos.create(image: File.new("public/shared_photos/dummy-image.jpg"))
end

It is giving error when try to run below command in watermark processors

command = "composite"
params = ["-gravity",
   "SouthEast",
   "https://s3.ap-south-1.amazonaws.com/s3_bucket_name/photos/images/000/000/025/thumb/download.png?1560325300",
   "/tmp/3151d071493084e42ac1e51947ef71ce20190612-25378-1usu3ji20190612-25378-135qwqy",
   "/tmp/3151d071493084e42ac1e51947ef71ce20190612-25378-1usu3ji20190612-25378-135qwqy"]

success = Paperclip.run(command, params.flatten.compact.collect{|e| "'#{e}'"}.join(" "))

It is giving below error:

Command :: composite '-gravity' 'SouthEast' 'https://s3.ap-south-1.amazonaws.com/s3_bucket_name/photos/images/000/000/026/thumb/download.png?1560328681' '/tmp/703fb0e145df584135fc841239e8aa3020190612-27615-14xprt020190612-27615-10g8hgo' '/tmp/703fb0e145df584135fc841239e8aa3020190612-27615-14xprt020190612-27615-10g8hgo'
Cocaine::ExitStatusError: Command 'composite '-gravity' 'SouthEast' 'https://s3.ap-south-1.amazonaws.com/s3_bucket_name/photos/images/000/000/026/thumb/download.png?1560328681' '/tmp/703fb0e145df584135fc841239e8aa3020190612-27615-14xprt020190612-27615-10g8hgo' '/tmp/703fb0e145df584135fc841239e8aa3020190612-27615-14xprt020190612-27615-10g8hgo'' returned 1. Expected 0
Here is the command output: STDOUT:
Parul Kanani
  • 111
  • 9

0 Answers0