TL;RD
¿Cómo se ingresan rutas de archivo en el cliente Ruby de la API de AWS S3 y se interpretan como imágenes, no como rutas de archivo literales?
Más detalles
Estoy usando el cliente Ruby AWS S3 para cargar imágenes mediante programación. Tomé este código de su código de inicio de ejemplo y apenas lo modifiqué. Consulte 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 endEsto funciona y se puede cargar en AWS, pero solo carga la ruta del archivo desde el cuerpo, no el archivo en sí.
ruta del archivo que se muestra al hacer clic en el enlace del archivo adjunto
Por lo que puedo ver en la documentación del Cliente, esto debería funcionar. https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#put_object-instance_method
Además, la carga manual de este archivo a través de la interfaz funciona bien, por lo que tiene que ser un problema en mi código.
¿Cómo se supone que debe informar a AWS que debe interpretar esa ruta de archivo como una ruta de archivo, y no solo como una cadena literal?
Sus documentos parecen un poco extraños y no sencillos, pero parece que es posible que deba pasar un objeto file/io, en lugar de la ruta.
Los documentos de Ruby aquí tienen un ejemplo como este:
s3_client.put_object( :bucket_name => 'mybucket', :key => 'some/key' :content_length => File.size('myfile.txt') ) do |buffer| File.open('myfile.txt') do |io| buffer.write(io.read(length)) until io.eof? end endu otra opción en los documentos de aws ruby sdk , en "Streaming a file from disk":
File.open('/source/file/path', 'rb') do |file| s3.put_object(bucket: 'bucket-name', key: 'object-key', body: file) endTienes dos problemas:
object_uploaded? que están afectando la forma en que se almacenan sus variables. Retire estos. image = File.open("#{Rails.root}/tmp/cosn_img.jpeg")Vea el código completo a continuación:
def object_uploaded?(image, s3_client, bucket_name, object_key) response = s3_client.put_object( body: image, acl: "public-read", bucket: bucket_name, key: object_key ) puts response if response.etag return true else return false end rescue StandardError => e puts "Error uploading object: #{e.message}" return false end def run_me image = File.open("#{Rails.root}/tmp/cosn_img.jpeg") 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?(image, 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