¡LEA AL MENOS EL PRIMERO PARA AQUÍ!
Sé que esto es 3 años demasiado tarde, pero la respuesta de Matt (aceptada) es incompleta y eventualmente te meterá en problemas. La clave aquí es que, si elige usar multipart/form-data
, el límite no debe aparecer en los datos del archivo que el servidor finalmente recibe.
Esto no es un problema application/x-www-form-urlencoded
, porque no hay límite. x-www-form-urlencoded
También siempre puede manejar datos binarios, por el simple recurso de convertir un byte arbitrario en tres 7BIT
bytes. Ineficiente, pero funciona (y tenga en cuenta que el comentario sobre no poder enviar nombres de archivos y datos binarios es incorrecto; simplemente lo envía como otro par clave / valor).
El problema con multipart/form-data
es que el separador de límites no debe estar presente en los datos del archivo (consulte RFC 2388 ; la sección 5.2 también incluye una excusa poco convincente para no tener un tipo MIME agregado adecuado que evite este problema).
Entonces, a primera vista, no multipart/form-data
tiene ningún valor en la carga de ningún archivo, binario o de otro tipo. Si no elige su límite correctamente, entonces usted va a llegar a tener un problema, si va a enviar texto o binario - el servidor se encuentra un límite en el lugar equivocado, y el archivo se truncará, o el POST fallará.
La clave es elegir una codificación y un límite de modo que los caracteres de límite seleccionados no puedan aparecer en la salida codificada. Una solución simple es usar base64
( no usar binario sin formato). En base64, 3 bytes arbitrarios se codifican en cuatro caracteres de 7 bits, donde el conjunto de caracteres de salida es [A-Za-z0-9+/=]
( es decir, alfanuméricos, '+', '/' o '='). =
es un caso especial y solo puede aparecer al final de la salida codificada, como simple =
o doble ==
. Ahora, elija su límite como una cadena ASCII de 7 bits que no puede aparecer en la base64
salida. Muchas de las opciones que ve en la red no pasan esta prueba: el MDN forma documentos, por ejemplo, use "blob" como límite cuando envíe datos binarios, lo cual no es bueno. Sin embargo, algo como "! Blob!" nunca aparecerá en la base64
salida.