as_tree в AWS S3 Ruby SDK V2

В v1 AWS S3 sdk был метод под названием «as_tree», который вы могли вызывать для списка объектов, и он возвращал его в удобном формате Branch/Leaf, который облегчал просмотр. Я ничего не могу найти в документах для v2 для такого метода. Есть ли способ сделать это в v2?

Если нет, как я могу воспроизвести аналогичную функциональность в версии 2? Я согласен написать новый метод для создания дерева и немного изменить свой код.


person Colton Voege    schedule 13.10.2016    source источник
comment
Похоже, кто-то уже ответил на это. stackoverflow.com/questions/29284946/   -  person George M Whitaker    schedule 14.10.2016


Ответы (1)


Спасибо, комментарий Джорджа М. Уитакера дал мне метод, который вернет некоторые данные, которые мне нужны. Я использовал это, чтобы создать свою собственную версию as_tree, поэтому я опубликую ее здесь.

class S3Node 
end

class S3Leaf < S3Node
  attr_accessor :object
  attr_accessor :key

  def leaf? 
    true
  end

  def branch?
    false
  end

  def initialize(summary)
    @key = summary.key
    @object = S3_BUCKET.object(@key)
  end
end

class S3Tree < S3Node
  attr_accessor :children
  attr_accessor :prefix

  def leaf? 
    false
  end

  def branch?
    true
  end

  def initialize(options) 
    @prefix = options[:prefix]

    @resp = S3_CLIENT.list_objects_v2(bucket: S3_BUCKET.name, prefix: @prefix, delimiter: '/')
    @common_prefixes = @resp.common_prefixes
    @contents = @resp.contents

    @trees = @common_prefixes.map do |common_prefix|
      S3Tree.new(prefix: common_prefix.prefix)
    end

    @leaves = @contents.select { |content| content.key.length > @prefix.length }.map do |content|
      S3Leaf.new(content)
    end

    @children = @trees + @leaves
  end
end

Таким образом, вы можете вызывать S3Tree.new(префикс: 'ваш/префикс/здесь') вместо S3_BUCKET.as_tree (префикс: 'ваш/префикс/здесь'), и вы должны иметь большую часть функциональности старого as_tree. В моем коде есть константы S3_BUCKET и S3_CLIENT, поэтому вам нужно будет заменить их своими собственными сегментами и клиентами. Вот код, который я использую для их инициализации, если кому-то интересно.

S3_RESOURCE = Aws::S3::Resource.new
S3_CLIENT = Aws::S3::Client.new

S3_BUCKET = S3_RESOURCE.bucket(ENV['BUCKET_NAME'])
person Colton Voege    schedule 14.10.2016