0

我有一个Gallery和Attachment模型。一个gallery has_many附件,基本上所有附件都是Attachment的':content'属性中引用的图片。当通过Carrierwave上传时,获取AWS S3对象以用于Rekognition

使用Carrierwave gem上传图像并通过fog-aws gem存储在Aws S3中。这工作正常。但是,我想用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 }) 

都具有相同的错误。我想知道我怎样才能获取s3对象形式@attachment,即使我可以这样做,我怎样才能在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 }) 

仍然没有成功...

任何提示吗?

回答

0

我终于想通了什么问题,通过以下AWS forum

的“图像”散列键采用的值必须命名为“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" 
相关问题