当通过Carrierwave上传时,获取AWS S3对象以用于Rekognition
问题描述:
我有一个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 })
仍然没有成功...
任何提示吗?
答
我终于想通了什么问题,通过以下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"