我试图在rails应用程序的ruby中使用aws-sdk gem(版本2)检查AWS S3上是否存在特定的pdf文件。
我建立了AWS连接,目前正在使用 exists?
方法:
put @ bucket.objects(前缀:“path / sample_100.pdf”)。存在吗?
运行上面的语句,我得到以下没有方法错误:
未定义的方法'存在?' for Aws :: Resources :: Collection
检查了一些文件但没什么帮助。有没有其他方法可以实现同样的目标。
提前致谢
答案 0 :(得分:1)
我自己不是Ruby开发人员,但我可以提出建议。
检查Amazon S3中是否存在对象的常用方法是使用HEAD Object操作。基本上,它返回对象的元数据(但没有内容)(如果存在),或404错误(如果它不存在)。它就像GET Object,但没有对象的内容。
我刚刚在AWS SDK for Ruby API Reference中查找并找到了这个方法:
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#head_object-instance_method
看一看,它可能就是你要找的东西。
答案 1 :(得分:1)
我建议你使用更简单的S3 gem:https://github.com/qoobaa/s3如果你只需要处理S3。你可以这样做:
object = bucket.objects.find("example.pdf")
答案 2 :(得分:0)
如Bruno所述,您可以使用head_object
来获取文件信息,而无需实际获取。如果找不到(或其他问题,例如权限),则会引发异常。因此,如果head_object
返回,则文件存在。
这是一个存在的文件:
> head = s3.head_object(bucket: bucket, key: path)
=> #<struct Aws::S3::Types::HeadObjectOutput last_modified=2020-06-05 16:18:05 +0000, content_length=553, etc...>
这是一个不存在的,它引发了异常:
> path << '/not-really'
=> "example/file/not-really"
> head = s3.head_object(bucket: bucket, key: path)
Aws::S3::Errors::NotFound
Traceback (most recent call last):
1: from (irb):18
Aws::S3::Errors::NotFound ()
以下是您可以使用自己的s3_exists?
方法的方法:
def s3_exists?(bucket, path)
s3.head_object(bucket: bucket, key: path)
true
rescue
false
end