Я пытаюсь загрузить файл размером 32+ МБ на сервер с помощью API. Единственное ограничение, которое у меня есть, - это использование только встроенных модулей. Я видел много примеров использования библиотеки requests
, но я пытаюсь решить с помощью urllib
. Используя curl
в качестве PoC, я сделал эту работу следующим образом:
curl -v --request POST --url 'https://domain/upload/long-string/' --form 'apikey=my-api-key' --form 'file=@my-file.extension'
Используя urllib
, я написал код ниже, но он не работает, потому что сервер всегда возвращает ошибку 400
:
import urllib
def post_bigfile(upload_url, file, auth, timeout):
headers = {'Accept': '*/*', 'Content-Type': 'multipart/form-data'}
data = {'file': file, 'apikey': auth}
req = urllib.request.Request(upload_url, headers=headers,
data=urlencode(data).encode('utf-8'), method='POST')
return urllib.request.urlopen(req, timeout=timeout)
post_bigfile('https://domain/upload/long-string/', open('my-file.extension','rb'), 'my-api-key', 20)
Я пытался использовать разные значения Content-Type
и Accept
, но это все равно не работает. Что я мог сделать не так? Есть ли другой встроенный модуль, который я мог бы использовать, чтобы лучше решить эту проблему?