2013-08-13 2 views
16

Я пытаюсь в рубине читать изображение с url и сохранить его до Tempfile для последующей обработки.Write StringIO to Tempfile

require 'open-uri' 

url = 'http://upload.wikimedia.org/wikipedia/commons/8/89/Robie_House.jpg' 
file = Tempfile.new(['temp','.jpg']) 
stringIo = open(url) 
# this is part I am confused about how to save StringIO to temp file? 
file.write stringIo 

Это не работает в результате temp.jpg не является действительным изображением. Не знаете, как это сделать.

Благодаря

ответ

29

Ты супер близко:

file.binmode 
file.write stringIo.read 

open(url) только открывается поток для чтения. Он фактически не считывает данные до тех пор, пока вы не назовете на него .read (который затем можно передать в file.write).

+3

Спасибо, супер близко hehe love that. Также мне не хватало 'file.binmode', если у кого-то была аналогичная проблема. –

+1

thnx для file.binmode !! – Zippie

3

Вы также можете создать свой временный файл с правильной кодировкой, например, так:

файл = Tempfile.new ([ 'Темп', 'JPG.]: Кодирование => 'ASCII-8bit')

Это то же самое, что установка файла в binmode.