2017-02-16 18 views
2

Мне нужен POST-файл в формате MULTIPART/FORM-DATA.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 загружает (но скоро он посадят). До этого установите requests-toolbelt из PyPI. Для того, чтобы использовать его, ваш сценарий будет выглядеть

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}) 

Для получения дополнительной документации об этой библиотеке и MultipartEncoder см http://toolbelt.readthedocs.io/en/latest/uploading-data.html#streaming-multipart-data-encoder

+0

поток ли запросы на загрузку, когда размер данных превышает некоторый предел? В вашем примере кода я не вижу использования «StreamingIterator». Кроме того, «но он скоро приземлится». Не могли бы вы предоставить какую-то ссылку для этого? –