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

OK heres a clue leading to another question…

I managed to get this error when trying to remove :imageuploaderloader
from the path…

private

def update_sha_1_hash
self.sha_1_hash = Digest::SHA1.hexdigest(self.image.slice!
“:ImageUploader”)
end

undefined method `slice!’ for
/uploads/tmp/1380243400-416-3987/piechart.gif:ImageUploader

Why is slice! an undefined method? Is this a scope issue?

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