Чем отправка файлов через библиотеку Python Requests отличается от Curl? - PullRequest
3 голосов
/ 20 сентября 2019

Мне нужно загрузить файл в Facebook через API.Чтобы сделать это, я попытался использовать Curl, и все прекрасно работает:

curl -F 'source=@/file.mp4' -F 'access_token=secret' https://graph.facebook.com/v4.0/act_000042/advideos

Также я пытаюсь реализовать то же самое в Python, используя запросы:

    import requests # requests==2.19.1

    with open('/file.mp4', 'rb') as filecontent:
    response = requests.post(
       'https://graph.facebook.com/v4.0/act_000042/advideos',
        data={
            'access_token': 'secret',
        },
        files={
           'source': filecontent,
        }
    )

И я получаю ту же ошибку: {'error': {'code': 1, 'message': 'Произошла неизвестная ошибка'}.Таким образом, существует некоторая разница между тем, как Curl загружает файлы и как запросы загружают их.

В чем разница и как я могу реализовать такую ​​же загрузку через запросы?

1 Ответ

3 голосов
/ 25 сентября 2019

Хорошо, я понял, что разница в Content-Disposition.Curl ничего не добавляет, если имя файла содержит символы utf-8 и расположение содержимого выглядит следующим образом:

Content-Disposition: form-data; name="source"; filename="someunicodename..."

Запросы делает расположение содержимого в соответствии с https://greenbytes.de/tech/webdav/rfc5987.html и выглядит так::

Content-Disposition: form-data; name="source"; filename*=utf-8''someunicodename ...

API Facebook не понимает спецификации rfc5987 и считает такое расположение контента неуместным.Использование только символов ASCII в имени файла решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...