Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Заливка большого файла на WEB сервер методом POST python

#python #сервер #http #post


Помогите разобраться в чем проблема.
Хочу залить файл на сервер, использую библиотеку requests.
Маленький файл льется отлично, с большим файлом беда - не уходит.
Код:

import requests
r = requests.get('запорос на урл')
upload_url = r['урл сервера']
file = {'video_file': ('1.mp4', open('S:/1.mp4', 'rb'))}
r2 = requests.post(upload_url, files=file)


ответ питона 

Traceback (most recent call last):
  File "S:/charm/projects/2.py", line 13, in 
    r2 = requests.post(upload_url, files=file)
  File "S:\charm\projects\venv\lib\site-packages\requests\api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "S:\charm\projects\venv\lib\site-packages\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "S:\charm\projects\venv\lib\site-packages\requests\sessions.py", line 494,
in request
    prep = self.prepare_request(req)
  File "S:\charm\projects\venv\lib\site-packages\requests\sessions.py", line 437,
in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "S:\charm\projects\venv\lib\site-packages\requests\models.py", line 308, in
prepare
    self.prepare_body(data, files, json)
  File "S:\charm\projects\venv\lib\site-packages\requests\models.py", line 496, in
prepare_body
    (body, content_type) = self._encode_files(files, data)
  File "S:\charm\projects\venv\lib\site-packages\requests\models.py", line 159, in
_encode_files
    fdata = fp.read()
MemoryError


Повторю, маленькие файлы грузит отлично.
Что не так?
    


Ответы

Ответ 1



Попробуйте использовать requests-toolbelt: # pip install requests-toolbelt from requests_toolbelt import MultipartEncoder # pip install requests import requests upload_file = open('S:/1.mp4', 'rb') payload = MultipartEncoder({'1.mp4': upload_file}) rs = requests.post('', data=payload , headers={'Content-Type': payload.content_type}) print(rs)

Ответ 2



Если сервер может напрямую файл принимать (в http message-body), то достаточно файл как data передать: import requests with open('1.mp4', 'rb') as file: requests.post(url, data=file)

Ответ 3



Чтобы послать файл на сервер, используя multipart/form-data Сontent-Type как
html-элементом в браузере делают, можно pycurl использовать: import pycurl c = pycurl.Curl() c.setopt(c.URL, url) c.setopt(c.HTTPPOST, [('file', (c.FORM_FILE, filename))]) c.perform() c.close()

Комментариев нет:

Отправить комментарий