Собираюсь предложить здесь ответ на свой вопрос, который, я думаю, лучше соответствует тому, что я пытался сделать.Этот метод на самом деле не создает файл (нет временного файла).
Поскольку ZipFile расширяется и является просто набором удобных методов для ZipCentralDirectory, вы можете работать непосредственно с ZipCentralDirectory вместо ZipFile.Это позволит вам использовать потоки ввода-вывода для создания и записи файла zip.Плюс добавьте использование StringIO, и вы можете сделать это из строки:
# load a zip file from a URL into a string
resp = Net::HTTP.new("www.somewhere.com", 80).get("/some.zip")
zip_as_string = response.body
# open as a zip
zip = Zip::ZipCentralDirectory.read_from_stream(StringIO.new(zip_as_string))
# work with the zip file.
# i just output the names of each entry to show that it was read correctly
zip.each { |zf| puts zf.name }
# write zip back to an output stream
out = StringIO.new
zip.write_to_stream(out)
# use 'out' or 'out.string' to do whatever with the resulting zip file.
out.string
Обновление:
На самом деле это вообще не работает.Он запишет читаемый zip-файл, но ТОЛЬКО «оглавление» zip-файла.Все внутренние файлы имеют длину 0.Углубившись в реализацию Zip, похоже, что она хранит в памяти только метаданные zip-записи и возвращается к базовому файлу для чтения всего остального.Исходя из этого, похоже, что вообще невозможно использовать реализацию Zip без записи в файловую систему.