通过 Carrierwave 上传时获取 AWS S3 对象以在 Rekognition 中使用

Fetch an AWS S3 object to use in Rekognition when uploaded via Carrierwave

我有一个图库和附件模型。图库 has_many 附件和基本上所有附件都是在附件的“:content”属性中引用的图像。

图片是使用Carrierwave gem and are stored in Aws S3 via fog-aws gem. This works OK. However, I'd like to conduct image recognition to the uploaded images with Amazon Rekognition上传的。

我已经安装了 aws-sdk gem 并且我能够毫无问题地实例化 Rekognition,直到我调用 detect_labels 方法,此时我无法使用我的附加图像作为参数这个方法。

太胖了我试过:

@attachement = Attachment.first
client = Aws::Rekognition::Client.new
resp = client.detect_labels(
         image: @attachment
       )
# I GET expected params[:image] to be a hash... and got class 'Attachment' instead

我试过使用:

client.detect_labels( image: { @attachment })
client.detect_labels( image: { @attachment.content.url })
client.detect_labels( image: { @attachment.content })

全部出现同样的错误。我想知道如何从@attachment 中获取 s3 对象,即使我可以这样做,我又如何将它用作 detect_labels 中的参数。

我也试过直接获取 s3 对象来尝试最后一点:

s3 = AWS:S3:Client.new
s3_object = s3.list_objects(bucket: 'my-bucket-name').contents[0]

# and then

client.detect_labels( image: { s3_object })

仍然没有成功...

有什么建议吗?

在以下AWS forum

的帮助下,我终于弄清楚了问题出在哪里

'Image' 哈希键将必须命名为 's3_object' 的对象作为值,随后只需要 S3 存储桶名称和要处理的文件的路径。作为参考,请参阅下面的正确示例:

client = Aws::Rekognition::Client.new
resp = client.detect_labels(
         image:
            { s3_object: {
              bucket: "my-bucket-name",
              name: @attachment.content.path, 
            },
          }
       )

# @attachment.content.path => "uploads/my_picture.jpg"