Я знаю, как получить содержимое обычного 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-файла. Это отлично работает с обычным zip-файлом. Но когда 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
В основном мой вопрос: как я могу создать файл из потока? Или есть более простой подход к этому, чем мой?
===EDIT=== Я использую скрепку для хранения файлов.