2017-01-26 25 views
0

Pythonのリクエストモジュールを使用してPUTでファイルをアップロードしようとしています。PythonリクエストPUTメソッドがゼロバイトファイルを作成します

私のコードはこれです:ファイルが作成され

with open(file, 'rb') as payload: 
    r = requests.put(url, data=payload, auth=('username', 'password')) 

、私は応答200を取得していますが、それは0バイトです。私が何か間違っていないならば、私はバグhereに会ったと思う。

これが該当しますか?はいの場合は、私が試すことができる回避策はありますか?

は私もhttplib2ライブラリ

with open(file, 'rb') as payload: 
    h = httplib2.Http(".cache") 
    h.add_credentials('user', 'pass') 
    resp, content = h.request(url, "PUT", body=payload) 

と同じしようとしましたが、要求は永遠にぶら下がったまま(再び0サイズのファイルが作成されます)。リクエストモジュールでも同じ問題がありますか?

[EDIT]いくつかの追加情報

PUTを受信して​​いるサービスがESXiハイパーバイザ上で実行されています。 authed PUTリクエストを作成すると、リクエストのファイルを/ tmpに保存するという機能があります。サーバー側が働いています(同じ仕事をするperlスクリプトとカールでテストしています)。

アップロードされたファイルは、ローカルファイルシステムにある.tgzファイルで、URLは"http://esx-server/tmp/file.tgz"の形式です。

+2

このPUTを受信して​​いる何のサービス?ファイルはどこに作成されていますか? –

+0

[編集]に[mcve]を含めるようにしてください。 – davidism

+0

'data'を' files'に変更し、 '{'file':payload}'を渡してみてください。 –

答えて

0

本当に何らかのバグがあるようです。

私の解決策は、urllib2を使用することでした。要求と同じように「クリーン」ではありません。しかし、それでも私が思っていたよりも優れています。

私の作業コードは、以下のようになります。

import urllib2 
from base64 import b64encode 

with open(source, 'rb') as file: 
    data = file.read() 
request = urllib2.Request(url) 
request.add_data(data) 
request.add_header('Authorization', 'Basic ' + b64encode(username + ':' + password)) 
request.get_method = lambda: "PUT" 
r = urllib2.urlopen(request) 
関連する問題