0
votes

TL;DR

How do you input file paths into the AWS S3 API Ruby client, and have them interpreted as images, not string literal file paths?

More Details

I'm using the Ruby AWS S3 client to upload images programmatically. I have taken this code from their example startup code and barely modified it myself. See https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-upload-bucket-item.html

def object_uploaded?(s3_client, bucket_name, object_key)
    response = s3_client.put_object(
      body:   "tmp/cosn_img.jpeg", # is always interpreted literally
      acl:    "public-read",
      bucket: bucket_name,
      key:    object_key
    )
    if response.etag
      return true
    else
      return false
    end
  rescue StandardError => e
    puts "Error uploading object: #{e.message}"
    return false
  end

  # Full example call:
  def run_me
    bucket_name = 'cosn-images'
    object_key =  "#{order_number}-trello-pic_#{list_config[:ac_campaign_id]}.jpeg"
    region = 'us-west-2'
    s3_client = Aws::S3::Client.new(region: region)

    if object_uploaded?(s3_client, bucket_name, object_key)
      puts "Object '#{object_key}' uploaded to bucket '#{bucket_name}'."
    else
      puts "Object '#{object_key}' not uploaded to bucket '#{bucket_name}'."
    end
  end

This works and is able to upload to AWS, but it is uploading just the file path from the body, not the actual file itself.

enter image description here

file path shown when you click on attachment link

As far as I can see from the Client documentation, this should work. https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#put_object-instance_method

enter image description here Client docs

Also, manually uploading this file through the frontend does work just fine, so it has to be an issue in my code.

How are you supposed to let AWS know that it should interpret that file path as a file path, and not just as a string literal?

By using upload_file instead of put_object. Otherwise you can do body: open("tmp/cosn_img.jpeg", 'r').read() - jordanm
@jordanm Could you expand on your answer? I tried using body: open("tmp/cosn_img.jpeg", 'r').read(), but that didn't seem to work. It just returned an empty string. And I'm not sure how to mesh upload_file in with the rest of the process and authentication. - McKay Whiting
You would have to read the file in 'rb' mode instead of 'r' mode for it to read the image file correctly - Moiz Mansur