2017-02-16 5 views
2

MULTIPART/FORM-DATAに.wavファイルをPOSTする必要があります。私は2つの問題直面していますpython:リクエスト、MULTIPART/FORM-DATAを投稿して大きなファイルをストリームするにはどうすればいいですか?

import requests 
import json 
import wave 

def get_binwave(filename): 

    w = wave.open(filename, "rb") 
    binary_data = w.readframes(w.getnframes()) 
    w.close() 
    return binary_data 


payload = { 
    "operating_mode":"accurate", 
    "model":{ 
     "name":"code" 
    }, 
    "channels":{ 
     "first":{ 
      "format": "audio_format", 
      "result_format": "lattice" 
     } 
    } 
} 

multiple_files = [ 
    ("json","application/json",json.dumps(payload)), 
    ("first","audio/wave",str(get_binwave("c.wav")))] 
r = requests.post("http://localhost:8080", files=multiple_files) 

私のスクリプトは、これまでのところです

  1. .wavファイルのバイナリが大きすぎると、私は、私はそれをストリーミングする必要があります推測しています?

  2. サーバは、境界が "xxx --------------- xxx"であることを想定しています。どうすれば設定できますか?

どうすればこのように正しくできますか?

答えて

0

リクエストは実際にはmultipart/form-data個のアップロードをストリーミングしません(ただし、すぐにそこに着陸します)。それまでは、PyPIからrequests-toolbeltをインストールしてください。これを使用するには、あなたのスクリプトは、そのライブラリとMultipartEncoder詳細ドキュメントについては

import requests 
import json 
from requests_toolbelt.multipart import encoder 


payload = { 
    "operating_mode":"accurate", 
    "model":{ 
     "name":"code" 
    }, 
    "channels":{ 
     "first":{ 
      "format": "audio_format", 
      "result_format": "lattice" 
     } 
    } 
} 

multiple_files = [ 
    ("json", "application/json", json.dumps(payload)), 
    ("first", "audio/wave", open("c.wav", "rb"), 
] 
multipart_encoder = encoder.MultipartEncoder(
    fields=multiple_files, 
    boundary="xxx---------------xxx", 
) 
r = requests.post("http://localhost:8080", 
        data=multipart_encoder, 
        headers={'Content-Type': multipart_encoder.content_type}) 

ようになり、参照http://toolbelt.readthedocs.io/en/latest/uploading-data.html#streaming-multipart-data-encoder

+0

は、データサイズがいくつかの制限を超えた場合、アップロードを要求するストリーミングしていますか?あなたのコード例では、私は 'StreamingIterator'の使用を見ません。また、「すぐにそこに着陸するだろう」と言いました。 –

関連する問題