2014-05-18 2 views
0

내가이Python CGI - TCP 서버에 파일을 업로드하려면 어떻게해야합니까?

serverPort = 8181 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.bind(('', serverPort)) 
serverSocket.listen(5) 

같은 TCP 서버를 만들어 나는이

elif path == '/login': 
     header, query = message.split(b'\r\n\r\n') 
     fp = io.BytesIO(query) 
     form = cgi.FieldStorage(fp, environ={'REQUEST_METHOD':'POST'}) 

     connectionSocket.send(b'HTTP/1.1 200 OK\r\n') 
     connectionSocket.send(b'Content-type: text/html\r\n\r\n') 
     connectionSocket.send('<p>Hello {}!</p>'.format(form.getvalue('id')).encode('utf-8')) 

처럼 사용자의 로그인 데이터를 수신 할 수 있지만 내가 다중 업로드 데이터를 수신 할 수 없습니다! T^T

I 업로드 파일 용 HTML을 작성했습니다.

<HTML> 
<BODY> 

<FORM ENCTYPE="multipart/form-data" ACTION="http://127.0.0.1:8181/upload" METHOD=POST> 
    File to process: <INPUT NAME="file" TYPE="file"> 
    <INPUT TYPE="submit" VALUE="Send File"> 
</FORM> 

</BODY> 
</HTML> 

어떻게받을 수 있습니까? e 저것을 제외하고? 내가 HTTP 서버를 사용하는 방법에 대해

이 문제에 대한 좋은 방법입니다하지만 난 그런 TCP 서버를 사용 샤 우드 ...

저를 도와주세요! 이 문제를 해결할 수 없습니다 ... T^T

+0

cgi.FieldStorage로 읽기 – Daniel

+0

플라스크 또는 피라미드가있을 때 왜이 모든 고통을 겪었는지, 내가 알고 싶은 것입니다. –

답변

0

파일 업로드에서 다른 내용 유형이 사용됩니다. 일반적으로 POST는 application/x-www-form-urlencoded을 사용하지만 파일 업로드에는 multipart/form-data을 사용하는 양식이 필요합니다.

클래스는 일반적으로 CGI 환경 변수에서이를 감지하지만 CGI를 사용하지 않으면 가장 낮은 레벨에서 모든 것을 파싱합니다. 당신은 여기 CONTENT_TYPE 헤더에 통과해야합니다 :

form = cgi.FieldStorage(fp, environ={ 
    'REQUEST_METHOD':'POST', 'CONTENT_TYPE': 'multipart/form-data'}) 

이상적으로, 그 헤더는 물론, 수신 헤더에서 구문 분석됩니다.

+0

감사! 나는 당신의 대답을했지만 오류가 발생했습니다. 그리고 나는 나의 전체 소스 코드를 또 다른 질문으로 썼다. 너 나 좀 도와 줄 수있어? 링크는 [여기] (http://stackoverflow.com/questions/23723830/python-cgi-upload-error)입니다. – user3649308