2011-01-13 10 views
0
def getSize(f): 
    print StringIO(f) 
    im = Image.open(StringIO(f)) 
    size = im.size[0], im.size[1] 
    return size 

def download(source_url, g = False, correct_url = True): 
    try: 
     socket.setdefaulttimeout(10) 
     agents = ['Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)','Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)','Microsoft Internet Explorer/4.0b1 (Windows 95)','Opera/8.00 (Windows NT 5.1; U; en)'] 
     ree = urllib2.Request(source_url) 
     ree.add_header('User-Agent',random.choice(agents)) 
     ree.add_header('Accept-encoding', 'gzip') 
     opener = urllib2.build_opener() 
     h = opener.open(ree).read() 
     if g: 
      compressedstream = StringIO(h) 
      gzipper = gzip.GzipFile(fileobj=compressedstream) 
      data = gzipper.read() 
      return data 
     else: 
      return h 
    except Exception, e: 
     return "" 



pic = download("http://media2.ct.yelpcdn.com/photo/2MdauidaMUazuew2h0pdgQ/l") 
s = getSize(pic) 

私はこれを行うと、エラーがある:どうして私のpythonコードがうまくいかないのですか?

print StringIO(f) 
File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1980, in open 
raise IOError("cannot identify image file") 
IOError: cannot identify image file 
+1

download()がスローする有用な例外は破棄されています。Image.open()は現在ダウンロード中のエラーを説明するdownload()を返そうとしている可能性があります。 。そのtry..catchブロックを削除すると、それ以上の有益なエラーは出ますか? – jshu

+0

djangoタグを削除するためにタグを付け直しました - ここでdjangoに依存しません – Day

答えて

3

問題はあなたのAccept-Encoding状態gzipはそうあなたはおそらくgzip圧縮された画像を取得しているということです。

gzip解凍を使用してコードを試したところ、問題なく動作しました。あなたは常にデータを返すために、ここを除いて/試してgzipを求めるとラップができ

pic = download("http://media2.ct.yelpcdn.com/photo/2MdauidaMUazuew2h0pdgQ/l", g=True) 
    s = getSize(pic) 

だから'image.*'

ree.add_header('User-Agent',random.choice(agents)) 
    ree.add_header('Accept-Encoding', 'image.*') 

'gzip'からパート2をご'Accept-Encoding'を変更しませんgzipが文句を言うと変更されません。

+0

gzipまたはイメージのすべてのダウンロードを処理するダウンロード機能を変更するにはどうすればよいですか? – TIMEX

+0

try/exceptブロックでgzip関数をラップすることができますが、サーバーはaccept-encodingにないコンテンツタイプを送信してはいけません。非常に起こりそうもないので、もしあなたがこれをやりたいのであれば、あなたはPILでそれを開こうとした後に応答がgzipされているかどうかテストします。 –

関連する問題