无法从 Python 个请求上传文件,而 CURL 工作正常

Can't upload file from Python requests, while CURL is work fine

我正在尝试使用此功能将文件上传到某些 api:

 def upload_avatar(cred, file):
     headers = {'accept': '*/*', 'Content-Type': 'multipart/form-data', 'Authorization': f'Bearer {cred}'}
     files = { 'UploadForm[avatar]': ('image1.jpg', open('image1.jpg', 'rb'), 'image/jpg')}
     signup_req = requests.post(api_enpoint + "/profile/avatar", headers=headers, files=files)
     signup_req.raise_for_status()

并获得422 Client Error: Unprocessable entity for url: https://api_endpoint/v1/profile/avatar

虽然 CURL 命令工作正常:

curl -v -X POST "https://api_endpoint/v1/profile/avatar" -H  "accept: */*" -H  "Content-Type: multipart/form-data" -H "Authorization: Bearer SAME_LONG_TOKEN" -F "UploadForm[avatar]=@image1.jpg;type=image/jpeg"

有什么区别?

试试这个

import requests


def upload_avatar(cred, file):
    url = "https://api_endpoint/v1/profile/avatar"

    files = [
      (
          'UploadForm[avatar]',
          ('image1.jpg', open('image1.jpg', 'rb'),
           'application/octet-stream'))
    ]
    headers = {
      'accept': '*/*',
      'Authorization': 'Bearer SAME_LONG_TOKEN',
      'Content-Type': 'multipart/form-data',
      'Authorization': f'Bearer {cred}'
    }
    response = requests.request("POST", url, headers=headers, files=files)

    print(response.text)

您可以删除 headers:

  • Accept: */*
  • Content-Type: multipart/form-data

requests 在您使用它的 jsondatafiles kwargs 时会自行处理它......如果您指定它们,它似乎吓坏了。

我用 httpbin 比较了 curlrequests HTTP 请求的内容,这是一个方便的工具。

因此对于您的示例,它将是:

headers = {'Authorization': f'Bearer {cred}'} 
files = {'UploadForm[avatar]': ('image1.jpg', open('image1.jpg', 'rb'), 'image/jpeg')} 
signup_req = requests.post('https://httpbin.org/post', headers=headers, files=files)