2013-04-11 3 views
0

좋은 아침, 지역 사회.python - socket download image

시간이 지나면이 스레드가 시작됩니다. 파이썬 소켓 모듈을 사용하여 www에서 그림을 다운로드하려고합니다. "recv()"로 그림의 원본을 가져 와서 이진 모드로 파일에 쓰고 있습니다. "answer.split ("image/jpeg ")"로 헤더의 내용을 분할해도 문제가 해결되지 않습니다. Heres는

내 코드 : 일반 텍스트

import socket 

socket.setdefaulttimeout(30) 

HOST = 'ict.de' 
PORT = 80   

def makestr(s):#create paket-string from list 
    rs = "" 
    for x in range(0,len(s)-1): 
      rs+=s[x]+"\r\n" 
    rs+="\r\n" 
    return rs 

def sendcap(sdata): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.send(sdata) 

    recvd="" 
    while True: 
     data = s.recv(1024) 
     if not data: print " Done "; break 
     recvd += data 
    data = recvd.split("image/jpeg")[1] 
    s.close() 

    return data 

xy = [] 
xy.append("GET /fileadmin/ict/images/Presse/Download-Button_1700x1000.jpg HTTP/1.1") 
xy.append("Host: www.ict.de") 
xy.append("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101  Firefox/19.0") 
xy.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") 
xy.append("Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3") 
xy.append("Accept-Encoding: gzip, deflate") 
xy.append("DNT: 1") 
xy.append("Connection: keep-alive") 
data = sendcap(makestr(xy)) 
f = open("logo.jpg","wb") 
f.write(data) 
f.close() 

데이터 (이미지/JPEG에서 헤더없이 분할)이 같은 "ÿØÿá5ExifMM * BJ (1r2Ž ‡ i¤Ð ü € 'ü의 €'어도비이다 Photoshop CS5 Windows2012 : 03 : 05 13:37:44 ¤ & (.h 어원 _Adobe_CMÿîAdobed € "ÀÀ ^"ÿÝ ÿÄ? 3! 1AQa "q2'¡ ± B # $ RÁb34r, C % 'S ¤ºcs5 ¢ ²ƒ & D"TdE £ "012"를 참조하십시오.

windows picture show로 파일을 열려고 할 때 파일이 손상되었다는 오류가 발생합니다.

누군가가 나를 도울 수 있기를 바랍니다.

답변

0

'image/jpeg'에서 분할하는 것은 작동하지 않습니다. HTTP 헤더를 종료하는 두 개의 '\r\n'이 있기 때문입니다.

헤더가 특정 순서로 제공되지 않을 수도 있으므로 이와 같은 응답을 처리하면 갑자기 작동하지 않을 수 있습니다.

은 헤더의 끝을 찾아야한다 아무것도 표시하는 경우 :

data = recvd.split("\r\n\r\n", 1)[1] 

그러나 conent이 chunked를 전송하지 않은 경우 물론 이것은 단지 작동

.

이런 종류의 작업을 수행하도록 설계된 라이브러리 (requests, urllib2)는 왜 사용하지 않으시겠습니까?

+0

나는 urllib2로 작업했지만, 나는 그것이 더 낮은 레벨에서 어떻게 작동하는지 배우고 싶다. 나는 생각했다 \ r \ n \ r \ n는 paket의 끝을 표시한다. 그것을 시도하려고합니다. - 편집 : IT 작동;) - 변경 "data = recvd.split ("image/jpeg ")"[1] "data = recvd.split ("\ r \ n \ r \ n ") [1]" –