SHA1 and Carrierwave duplicate image test

Hi, I am using Carrierwave in my Rails 3.x app along with Fog to store images on S3. I am trying to prevent uploading of duplicate images. I am a novice programmer and would appreciate any suggestions.

This is my approach:

1. Upload file using carrierwave. class ImageUploader < CarrierWave::Uploader::Base   include CarrierWave::MiniMagick    storage :fog    include CarrierWave::MimeTypes    process :set_content_type    def store_dir     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"    end

2. In picture model: require 'digest/sha1' before_validation :update_sha_1_hash private   def update_sha_1_hash     self.sha_1_hash = Digest::SHA1.hexdigest(self.image)   end

3.Check If the hash identifier in #2 is a duplicate of an existing upload validates_uniqueness_of :sha_1_hash

Here's the error: can't convert ImageUploader into String I am not sure how to direct SHA1 to the actual image file before it is uploaded..

Thanks, Dave

Dear Dave,

That looks like it's very nearly there. I suspect that the error you are encountering is because `self.image` in Step 2 is the ImageUploader itself, rather than the path to the file. I don't think you need to worry about trying to compute the hash prior to upload; instead, you could let the image upload but check the hash prior to saving -- exactly like you're trying. Perhaps you might like to try if changing

    Digest::SHA1.hexdigest(self.image)

to

    Digest::SHA1.file(image.path).hexdigest

works for you. (It's not necessary to use `self.image` opposed to `image` as it's a 'get'/read context, rather than a 'set'/write context.) You might want to also ensure you're validating presence of `:sha_1_hash`.

Peace, tiredpixel

Dear Tiredpixel,

Thank you so much. I have been working on this for several days now and this worked beautifully.

Thank you for taking the time to help!

Dave C.

Dear Dave,

Delighted to hear it; you are most welcome!

Peace, tiredpixel