В настоящее время я пытаюсь прикрепить файлы изображений к модели напрямую из 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)? Или я застрял на самом деле, сохраняя его на жестком диске, прежде чем я смогу подключить его, даже если эта версия будет удалена в конце?
UPDATE
Благодаря черничным полям, я думаю, что я немного ближе к своему решению. Вот строка кода, которую я добавил, и она дает мне нужный файл Tempfile / File:
photo.image = zip_file.get_output_stream image
Однако мой Photo
объект не примет передаваемый файл, поскольку это не image/jpeg
. Фактически, проверка content_type
файла показывает application/x-empty
. Я думаю, что это может быть связано с тем, что получение выходного потока добавляет временную метку к концу файла, так что в итоге он выглядит как imagename.jpg20110203-20203-hukq0n
. Редактировать : Кроме того, создаваемый им временный файл не содержит никаких данных и имеет размер 0. Таким образом, похоже, что это может быть не ответ.
Итак, следующий вопрос: кто-нибудь знает, как получить это, чтобы дать мне файл изображения / JPEG?
ОБНОВЛЕНИЕ :
Я играл с этим еще немного. Кажется, выходной поток - это не путь, а скорее входной поток (который всегда меня смущал). Используя get_input_stream на ZipEntry, я получаю двоичные данные в файле. Теперь я думаю, что мне просто нужно выяснить, как вставить это в приложение Paperclip (как объект File). Я пытался вставить ZipInputStream непосредственно во вложение, но, конечно, это не работает. Мне действительно трудно поверить, что никто не пытался преобразовать извлеченный ZipEntry в файл. Есть ли какая-то причина, по которой это будет считаться плохой практикой программирования? Мне кажется, что пропуск записи на диск для временного файла будет вполне приемлемым и поддерживается в чем-то вроде управления Zip-архивами.
В любом случае, вопрос все еще стоит:
Есть ли способ преобразования входного потока в объект File (или Tempfile)? Желательно без необходимости записи на диск.