2016-08-17 12 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応答本体とは何ですか? P.P.アップロードハンドラの先頭にロギングを追加して、呼び出されるかどうかを確認してください。 – webKnjaZ

+0

P.P.S.小さなファイルを最初にアップロードしてみてください – webKnjaZ

+0

チェリーピーのアプリから '/ home/uvv/upload'ファイルを書くための適切な権限があることを確認してください。 – webKnjaZ

答えて

2

それはレスポンスから情報を取得するために便利です。要求を送信すると、応答が返されます。このレスポンスから、HTTPコードについての情報を得ることができます。ここで、200はOKを意味し、400は悪い要求を意味します。それはあなたのcherrypyログに表示されるテキストです:POST /upload HTTP/1.1" 400。あなたは、コード怒鳴ると、上記のコードを使用している場合はより多くの情報を取得するには、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) 

を使用して応答テキストを印刷、それがサーバーをCherryPyにするために、ファイルをアップロードする作業例です。

#!/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/に置き換えて、プロジェクトに合ったパスに置き換えます。