2016-08-17 7 views
1

python3 클라이언트에서 cherrypy로 파일을 POST하고 싶습니다. 요청 라이브러리를 사용하고 있습니다. 내 클라이언트 코드 :CherryPy 업로드 파일

import requests 

url = 'http://127.0.0.1:8080/upload' 
files = {'file.zip': open('file.zip', 'rb')} 

r = requests.post(url, files=files) 

내 서버 코드 : 서버가 오류를 반환

import os 
import tempfile 
import shutil 

import cherrypy 


config = { 
    'global' : { 
     'server.socket_host' : '127.0.0.1', 
     'server.socket_port' : 8080, 
     'server.thread_pool' : 8, 
     'server.max_request_body_size' : 0, 
     'server.socket_timeout' : 60 
    } 
} 


class App: 
    @cherrypy.config(**{'response.timeout': 3600}) 
    @cherrypy.expose() 
    def upload(self): 
     '''Handle non-multipart upload''' 

     destination = os.path.join('/home/uvv/upload') 
     with open(destination, 'wb') as f: 
      shutil.copyfileobj(cherrypy.request.body, f) 

     return 'Okay' 


if __name__ == '__main__': 
     cherrypy.quickstart(App(), '/', config) 

:

127.0.0.1 - - [17/Aug/2016:11:38:49] "POST /upload HTTP/1.1" 400 2083 "" "python-requests/2.10.0" 
+0

게시 한 오류가 아니며 로그 항목입니다. HTTP 응답 본문이란 무엇입니까? 오후 8시 30 분 P.S. 업로드 처리기 시작시 로깅을 추가하여 호출 여부를 확인하십시오. – webKnjaZ

+0

P.P.S. 먼저 작은 파일을 업로드 해보십시오. – webKnjaZ

+0

그리고 cherrypy 앱에서'/ home/uvv/upload' 파일을 쓸 수있는 적절한 권한이 있는지 확인하십시오. – webKnjaZ

답변

2

그것은 응답에서 정보를 얻을 수있는 유용한이야. 요청을 보내면 응답을받습니다. 이 응답을 통해 HTTP 코드에 대한 정보를 얻을 수 있습니다. 여기서 200은 200을 의미하고 400은 잘못된 요청을 의미합니다. cherrypy 로그에 표시되는 텍스트는 POST /upload HTTP/1.1" 400입니다. 자세한 정보를 얻으려면, 당신은 코드 울부 짖는 소리와 위의 코드를 사용하는 경우 서버를 cherrypy에 파일을 업로드의 예를 일하고 print(r.text)

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import requests 

url = 'http://127.0.0.1:9090/upload' 
files = {'ufile': open('file.txt', 'rb')} 

r = requests.post(url, files=files) 

print(r) 
print(r.text) 

를 사용하여 응답 텍스트를 인쇄 할 수 있습니다.

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import os 
import cherrypy 

config = { 
    'global' : { 
     'server.socket_host' : '127.0.0.1', 
     'server.socket_port' : 9090, 
     'server.thread_pool' : 8, 
     'server.max_request_body_size' : 0, 
     'server.socket_timeout' : 60 
    } 
} 


class App: 

    @cherrypy.expose 
    def upload(self, ufile): 
     upload_path = os.path.normpath('/path/to/project/data/') 
     upload_file = os.path.join(upload_path, ufile.filename) 
     size = 0 
     with open(upload_file, 'wb') as out: 
      while True: 
       data = ufile.file.read(8192) 
       if not data: 
        break 
       out.write(data) 
       size += len(data) 
     out = ''' 
length: {} 
filename: {} 
mime-type: {} 
''' .format(size, ufile.filename, ufile.content_type, data) 
     return out 


if __name__ == '__main__': 
    cherrypy.quickstart(App(), '/', config) 

/path/to/project/data/을 프로젝트에 맞는 경로로 바꿉니다.