es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. 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.

    2. 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.

    3. 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.

    4. Token de autorización: Verifique si el parámetro cred en la función Python contiene el mismo token largo que el encabezado Authorization en el comando CURL. Si son diferentes, es posible que el servidor rechace la solicitud.

    5. 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 llamada requests.post en True para habilitar la validación SSL.

Comments are closed.