Rails S3 glob(通配符文件搜索)

时间:2018-03-13 02:41:37

标签: ruby-on-rails amazon-s3

在本地我可以Dir.glob("path/to/my/*.jpg")来获取匹配的路径数组。如何使用S3存储执行此操作?

1 个答案:

答案 0 :(得分:0)

开箱即用,S3允许"前缀" (最后用通配符),但不是通路中途的通配符。我创建了一个方法来使用搜索前缀直到第一个*,然后通过切换到正则表达式来过滤掉其余的。

这是通配符搜索:

# /app/services/S3.rb
class S3
  class << self

    # this is designed to imitate Dir.glob, so '*' is a wildcard
    def glob(filename_pattern)
      prefix = filename_pattern.sub(/\*.*/, "")
      regex = /.*/
      if filename_pattern =~ /\*/
        regex = Regexp.new filename_pattern[/\*.*/].gsub("*", ".*")
      end
      bucket.objects(prefix: prefix).map(&:key).select{|key| key.match(regex)}
    end

    private

    def bucket
      @bucket ||= Aws::S3::Resource.new(region: ENV['AWS_REGION']).bucket(ENV['AWS_S3_BUCKET'])
    end
  end
end

调用此类的示例:S3.glob("images/doggos/*.jpg")