Как загрузить файл с помощью запросов в Python

#python #python-3.x #python-requests

#python #python-3.x #python-запросы

Вопрос:

Я пытаюсь загрузить файл с помощью запросов Python и получаю код ошибки 400 (неверный запрос)

 #Update ticket with upload of CSV file
header_upload_file = {
            'Authorization': 'TOKEN id="'   token   '"',
            'Content-Type': 'multipart/form-data'
}

files = {
            'name': 'file',
            'filename': open(main_path   '/temp/test.txt', 'rb'),
            'Content-Disposition': 'form-data'
        }


response = requests.post(baseurl   '/incidents/number/'   ticket_number   '/attachments/', headers=header_upload_file, data=files, verify=certificate)
  

Если я попробую через Postman, это будет успешно, используя следующий код.

 url = "https://<url>"
payload = "------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="file"; filename="C:\Users\<filename>"rnContent-Type: text/csvrnrnrn------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'Authorization': "TOKEN id="3e9d095d-a47b-48b5-a0b8-ae8b8ad9ae74"",
'cache-control': "no-cache",
'Postman-Token': "bb155176-b1b8-47a6-8fb3-46f5740cf9e0"
}

response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
  

В чем я не прав?

Ответ №1:

Вместо этого вы должны использовать files параметр. Кроме того, не устанавливайте явно Content-Type в заголовке, чтобы requests он мог установить для вас правильную границу:

 header_upload_file = {
    'Authorization': 'TOKEN id="'   token   '"'
}
response = requests.post(
    baseurl   '/incidents/number/'   ticket_number   '/attachments/',
    headers=header_upload_file,
    files={'file': ('file', open(main_path   '/temp/test.txt', 'rb'), 'text/csv')},
    verify=certificate
)
  

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

1. К сожалению, безуспешно

2. Я обновил свой ответ, указав явный тип содержимого для файла.