Как мне получить временный объект File (с правильным типом содержимого, без записи на диск) непосредственно из ZipEntry (RubyZip, Paperclip, Rails 3)?

В настоящее время я пытаюсь прикрепить файлы изображений к модели непосредственно из zip-файла (т.е. без предварительного сохранения их на диск). Похоже, должен быть более четкий способ преобразования ZipEntry в Tempfile или File, который можно сохранить в памяти, чтобы передать другому методу или объекту, который знает, что с ним делать.

Вот мой код:

def extract (file = nil)
  Zip::ZipFile.open(file) { |zip_file|
    zip_file.each { |image|
      photo = self.photos.build
      # photo.image = image # this doesn't work
      # photo.image = File.open image # also doesn't work
      # photo.image = File.new image.filename
      photo.save
    }
  }
end

Но проблема в том, что photo.image - это приложение (через скрепку) к модели, и для назначения чего-либо в качестве вложения требуется, чтобы что-то было объектом File. Однако я не могу, хоть убей, понять, как преобразовать ZipEntry в файл. Единственный способ открытия или создания файла, который я видел, - это использовать строку для его пути, то есть мне нужно извлечь файл в определенное место. На самом деле это кажется глупым. Почему я не могу просто извлечь файл ZipEntry в выходной поток и преобразовать его там в файл?

Итак, главный вопрос: Могу ли я извлечь ZipEntry из Zip-файла и превратить его непосредственно в объект File (или прикрепить его напрямую как объект Paperclip)? Или я застрял на самом деле, сохраняя его на жестком диске, прежде чем смогу прикрепить его, даже если эта версия будет удалена в конце?

ОБНОВЛЕНИЕ Благодаря полям черники, я думаю, что я немного ближе к своему решению. Вот строка кода, которую я добавил, и она дает мне Tempfile / File, который мне нужен:

photo.image = zip_file.get_output_stream image

Однако мой объект Photo не принимает передаваемый файл, так как это не изображение / JPEG . Фактически, проверка content_type файла показывает application / x-empty . Я думаю, это может быть связано с тем, что получение выходного потока, кажется, добавляет метку времени в конец файла, так что в итоге он выглядит как imagename.jpg20110203-20203-hukq0n . Правка : Кроме того, временный файл, который он создает, не содержит никаких данных и имеет размер 0. Так что похоже, что это не может быть ответом.

Итак, следующий вопрос: Кто-нибудь знает, как заставить это дать мне файл изображения / JPEG?

ОБНОВЛЕНИЕ :

Я еще немного поигрался с этим. Кажется, что выходной поток - это не выход, а скорее входной поток (который всегда меня смущал). Используя get_input_stream в ZipEntry, я получаю двоичные данные в файле. Думаю, теперь мне просто нужно выяснить, как поместить это во вложение Paperclip (как объект File). Я пробовал протолкнуть ZipInputStream прямо во вложение, но, конечно, это не сработало. Мне действительно трудно поверить, что никто не пытался преобразовать извлеченный ZipEntry как файл. Есть ли причина, по которой это считается плохой практикой программирования? Мне кажется, что пропуск записи на диск временного файла был бы вполне приемлемым и поддерживаемым чем-то вроде управления архивом Zip.

В любом случае, вопрос все еще остается в силе:

Есть ли способ преобразовать входной поток в объект File (или Tempfile)? Желательно без записи на диск.

5
задан Josh Kovach 4 February 2011 в 16:59
поделиться