Я знаю, как извлечь содержимое обычного zip-файла с помощью rubyzip. Но у меня возникли проблемы с распаковыванием содержимого архива, и я надеюсь, что любой из вас, ребята, сможет мне помочь.
это код, который я использую для распаковки:
Zip::ZipFile::open(@file_location) do |zip|
zip.each do |entry|
next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
logger.debug "#{entry.name}"
@data = File.new("#{Rails.root.to_s}/tmp/#{entry.name}")
end
end
entry.name дает мне имя файла внутри zip-файла. Это прекрасно работает с обычным zipfile. Но когда zip-файл создается из папки, тогда имена записей выглядят примерно так: test-folder / test.pdf. Когда я тогда пытаюсь создать файл, он говорит мне, что файл не может быть найден. Вероятно, это связано с тем, что она находится внутри папки «test», которая находится внутри zip.
Если я проверяю запись как папку, папка не может быть найдена. Поэтому я решил, что решением будет прочитать запись в виде потока, а затем сохранить ее в виде файла. Получить входной поток легко, но как мне сохранить его в виде файла? Это то, что я получил до сих пор.
Zip::ZipFile::open(@file_location) do |zip|
zip.each do |entry|
next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
logger.debug "#{entry.name}"
@data = entry.get_input_stream.read
# How do i create a file from a stream?
end
end
В основном мой вопрос: как я могу создать файл из потока? Или есть более простой подход к этому, чем мой?
=== РЕДАКТИРОВАТЬ ===
Я использую скрепку для хранения файлов.