2014-09-02 4 views
0

내가 지금은 요청을 보낼 컬 사용해야 컬KeyError를 컬 파일 업로드를 처리

class HTTPRequestHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 
      if re.search('/api/v1/addphoto', self.path): 
        form_data=cgi.FieldStorage() 
        file_data=form_data['photofile'].value 
        # Next I will save this file 
        # fp =open('some/file','wb') 
        # fp.write(file_data) 
        # fp.close() 

에서 파일 업로드 요청을 처리 파이썬에서 HTTP 서버가 요청하고 명령은

curl -i -F name=photofile -F [email protected] http://server_ip:port/api/v1/addphoto 

그러나 서버 보고서 오류

File "./apiserver.py", line 21, in do_POST 
    file_data=form_data['photofile'].value 
File "/usr/lib/python2.7/cgi.py", line 541, in __getitem__ 
    raise KeyError, key 
KeyError: 'photofile' 

문제가 여기에 무엇입니까?

+0

귀하의 비교()'바보입니다. re.search (...)가 None :이 아닌 경우're.search (...) : – msvalkon

+0

인 경우 보통으로 변경하고 OK로 편집하십시오. 필자는 Python을 처음 사용하며 코드는 웹 자습서에서 가져온 것입니다. 오류에 대한 의견이 있으십니까? – mrmoment

답변

0

확인을 클릭하면 이유와 방법이 here에서 확인됩니다.

"서버 코드에 CGI 코드를 삽입 할 수 없습니다. CGIHTTPServer (및 CGI 일반적으로)의 핵심은 지정된 디렉토리에서 별도의 스크립트를 실행하고 출력을 반환한다는 것입니다. do_POST 메서드를 재정의 했으므로 양식 데이터를 구문 분석하는 코드가으로 호출되지 않았습니다. " (사실 나는 form_data를 인쇄하고 그것은 비어 있습니다 - "None, None, []"). 매개 변수 (details)에 전달

그리고 그것을 해결하기 위해 사용 re.search`의 결과에 None``의

form = cgi.FieldStorage(
     fp=self.rfile, 
     headers=self.headers, 
     environ={'REQUEST_METHOD':'POST', 
       'CONTENT_TYPE':self.headers['Content-Type'], 
       }) 
1

KeyError은 사전에 키가 없을 때 발생합니다.

저는 cgi.FieldStorage에 익숙하지 않지만 사전을 얻고 키 'photofile'이 누락 될 것으로 예상됩니다. 전체 form_data를 인쇄하고 내용을 확인하십시오.

form_data.get('photofile', '')을 사용하면 기본값을 가져오고 예외가 발생하지 않도록 할 수 있습니다.

지금까지 파일에 쓰려면 콘텍스트 관리자로 with 문을 사용할 수 있습니다.

with open('some/file','wb') as fp: 
    fp.write(file_data)