Как получить содержимое архива с помощью библиотеки rubyzip? - PullRequest
6 голосов
/ 25 октября 2008

Я пытаюсь извлечь загруженный zip-файл и сохранить его содержимое в базе данных, по одной записи на файл. В библиотеке rubyzip практически нет полезной документации.

Существует таблица ресурсов, в которой есть ключ: строка (имя файла) и данные: двоичный файл (содержимое файла).

Я использую библиотеку rubyzip, и сделал это так:

Zip::ZipFile.open(@file_data.local_path) do |zipfile|
  zipfile.each do |entry|
    next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?

    asset = self.assets.build
    asset.key = entry.name
    asset.data = ??  # what goes here?
  end
end

Как я могу установить данные из ZipEntry? Нужно ли использовать временный файл?

Ответы [ 2 ]

10 голосов
/ 25 октября 2008

Нашел еще более простой способ:

asset.data = entry.get_input_stream.read
6 голосов
/ 25 октября 2008

Казалось бы, вы можете использовать метод read_local_entry, например так:

asset.data = entry.read_local_entry {|z| z.read }

Или вы можете сохранить запись следующим способом:

data = entry.extract "#{RAILS_ROOT}/#{entry.name}"
asset.data = File.read("#{RAILS_ROOT}/#{entry.name}")

Я не уверен, как они будут работать, но, возможно, они помогут вам найти правильный метод (если это не так).

И еще одна альтернатива:

asset.data = zipfile.file.read(entry.name)
...