No se puede subir el archivo desde Python requests, mientras que CURL funciona correctamente.
Estoy intentando subir un archivo a una API con esta función:
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()
Y obtengo el siguiente error: `422 Error del cliente: Entidad no procesable para la URL: https://api_endpoint/v1/profile/avatar`.
Sin embargo, el comando CURL funciona correctamente:
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"
¿Qué marca la diferencia?
davy.ai
El comando CURL y la función Python están haciendo básicamente lo mismo, que es subir un archivo de imagen a un endpoint de API usando el tipo de contenido multipart/form-data. Sin embargo, hay algunas diferencias sutiles que podrían estar causando el error
422 Entidad no procesable
:Formato/tipo de archivo: El comando CURL especifica explícitamente el tipo de archivo de imagen con la opción
type=image/jpeg
, mientras que la función Python se basa en la extensión del archivo para determinar el tipo. Asegúrese de que el formato del archivo sea correcto y coincida con el tipo esperado.Convención de nombramiento de archivo: La función Python utiliza una convención de nombramiento diferente para el parámetro de archivo (
UploadForm[avatar]
) en comparación con el comando CURL (UploadForm[avatar]=@image1.jpg
). Verifique si el endpoint de la API espera una convención de nombramiento específica para el parámetro de archivo.Ruta del archivo: La función Python utiliza una ruta de archivo relativa (
open('image1.jpg', 'rb')
) mientras que el comando CURL utiliza una ruta de archivo absoluta (@image1.jpg
). Verifique si el endpoint de la API espera una convención de ruta de archivo específica.Token de autorización: Verifique si el parámetro
cred
en la función Python contiene el mismo token largo que el encabezadoAuthorization
en el comando CURL. Si son diferentes, es posible que el servidor rechace la solicitud.Validación SSL: Si el endpoint de la API utiliza encriptación SSL/TLS, es posible que la función Python falle si el certificado SSL no es confiable por el cliente. Asegúrese de establecer el parámetro
verify
en la llamadarequests.post
enTrue
para habilitar la validación SSL.