Search code examples
ruby-on-railsamazon-web-servicesamazon-s3fog

Rails 4, Fog, Amazon s3 - retrieving all the images as an array from a specific folder in a bucket.


I am using amazon s3, rails 4, and the FOG gem. I have an amazon bucket called uipstudy with 100 folders, each containing about 20 images. I use the following to get all the images in a specific folder (In my application_helper.rb which is included in the application_controller.rb).

 def get_files(image_folder)
   connection = Fog::Storage.new(
    provider: 'AWS',
    aws_access_key_id: '######',
    aws_secret_access_key: '#######'
      )
     connection.directories.get('uipimages', prefix:image_folder).files.map do |file|
       file.key
   end
 end

In my controller I have this....in this example I am looking in the folder "1" in the uipstudy bucket.

 #Amazon solution:
   @images = get_files('1')
   @images.each do |image|
      image = "https://s3.amazonaws.com/uipstudy/#{image}"
      @image_array << image
   end

The problem is that its returning the files inside the folder labelled "1" but also in 10, 11, 12,13....etc. I assumed that the prefix was an absolute but it appears not. Is there a way to enforce that the prefix gets exactly the folder specified in the prefix?


Solution

  • I think you should be able to make a small change in your script to get the behavior you want. Simply append a forward slash to the prefix so that it clearly shows you want things that are like a directory instead of any/all things that begin with a particular character.

    So, that would get you something like:

    directory = connection.directories.get('upimages', prefix: image_folder + '/')
    directory.files.map do |file|
      file.key
    end
    

    (I just split it into two commands to make it format/read easier)