LEIA PELO MENOS O PRIMEIRO PARA AQUI!
Eu sei que isso é 3 anos tarde demais, mas a resposta (aceita) de Matt está incompleta e acabará por causar problemas. A chave aqui é que, se você optar por usar multipart/form-data
, o limite não deverá aparecer nos dados do arquivo que o servidor eventualmente receber.
Isso não é um problema para application/x-www-form-urlencoded
, porque não há limites. x-www-form-urlencoded
também pode sempre manipular dados binários, pelo simples expediente de transformar um byte arbitrário em três 7BIT
bytes. Ineficiente, mas funciona (e observe que o comentário sobre a impossibilidade de enviar nomes de arquivos e dados binários está incorreto; basta enviá-lo como outro par de chave / valor).
O problema multipart/form-data
é que o separador de limites não deve estar presente nos dados do arquivo (consulte a RFC 2388 ; a seção 5.2 também inclui uma desculpa esfarrapada por não ter um tipo MIME agregado adequado que evite esse problema).
Portanto, à primeira vista, multipart/form-data
não tem valor algum em nenhum upload de arquivo, binário ou outro. Se você não escolher o seu limite corretamente, então você vai , eventualmente, ter um problema, se você está enviando texto simples ou binário simples - o servidor encontrará um limite no lugar errado, e seu arquivo será truncado, ou o POST vai falhar.
A chave é escolher uma codificação e um limite para que os caracteres de limite selecionados não possam aparecer na saída codificada. Uma solução simples é usar base64
( não use binário bruto). Na base64, 3 bytes arbitrários são codificados em quatro caracteres de 7 bits, onde o conjunto de caracteres de saída é [A-Za-z0-9+/=]
(ou seja, alfanuméricos, '+', '/' ou '='). =
é um caso especial e pode aparecer apenas no final da saída codificada, como um único =
ou um duplo ==
. Agora, escolha seu limite como uma sequência ASCII de 7 bits que não pode aparecer na base64
saída. Muitas opções que você vê na rede falham neste teste - o MDN forma docs, por exemplo, use "blob" como limite ao enviar dados binários - nada bom. No entanto, algo como "! Blob!" nunca aparecerá na base64
saída.