无法从 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
在您使用它的 json
、data
、files
kwargs 时会自行处理它......如果您指定它们,它似乎吓坏了。
我用 httpbin 比较了 curl
和 requests
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)
我正在尝试使用此功能将文件上传到某些 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
在您使用它的 json
、data
、files
kwargs 时会自行处理它......如果您指定它们,它似乎吓坏了。
我用 httpbin 比较了 curl
和 requests
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)