使用aws-sdk gem检查AWS S3路径上是否存在文件

时间:2017-08-15 17:24:16

标签: ruby-on-rails amazon-web-services amazon-s3 rubygems aws-sdk

我试图在rails应用程序的ruby中使用aws-sdk gem(版本2)检查AWS S3上是否存在特定的pdf文件。

我建立了AWS连接,目前正在使用 exists? 方法:

  

put @ bucket.objects(前缀:“path / sample_100.pdf”)。存在吗?

运行上面的语句,我得到以下没有方法错误:

  

未定义的方法'存在?' for Aws :: Resources :: Collection

检查了一些文件但没什么帮助。有没有其他方法可以实现同样的目标。

提前致谢

3 个答案:

答案 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