1001Ferramentas
📦 Dev

Parser multipart/form-data

Cole um body multipart/form-data com seu boundary e veja cada parte (Content-Disposition, filename, Content-Type, tamanho).

Ler um corpo multipart/form-data

Formulário com arquivo usa multipart/form-data, e o corpo resultante é uma sequência de partes separadas por um marcador declarado no Content-Type. Cada parte tem cabeçalhos próprios e depois seu conteúdo. Cole o corpo e a página separa as partes, mostrando nome do campo, nome do arquivo e tipo declarado de cada uma.

O marcador tem regra: ele aparece no corpo precedido de dois hifens, e o final da mensagem é o marcador com dois hifens também no fim. Por isso ele precisa ser uma sequência que não ocorra dentro de nenhuma parte — se ocorrer, o corpo é cortado no lugar errado. É a razão de os navegadores gerarem marcador longo e aleatório em vez de algo legível.

A informação que decide o processamento vem do Content-Disposition de cada parte: o parâmetro name é o nome do campo do formulário, e a presença de filename é o que distingue arquivo de campo de texto. Vale desconfiar do filename recebido — ele vem do cliente, pode conter caminho e é o vetor clássico de gravar arquivo fora da pasta pretendida.

Perguntas frequentes

Por que não enviar formulário com arquivo em JSON?
Porque JSON não tem tipo binário: o arquivo teria de ir em base64, crescendo um terço, e o servidor precisaria carregar tudo na memória para decodificar. Multipart permite processar em fluxo, gravando o arquivo em disco conforme chega, sem inflar o tamanho.
Qual a diferença para application/x-www-form-urlencoded?
O urlencoded junta tudo numa string de pares com percent-encoding, o que serve para campos curtos e é mais compacto. Ele não tem como carregar binário sem inflar, e não permite tipo por campo. Formulário sem arquivo costuma usar urlencoded; com arquivo, multipart é o caminho.
Como aparecem acentos no nome do arquivo?
É a parte mais bagunçada da especificação. A forma antiga põe o nome direto em filename, sem dizer a codificação, e cada cliente escolheu a sua. A forma correta atual usa filename com asterisco e codificação declarada. Servidor robusto lê as duas e prefere a segunda quando existe.

Ferramentas Relacionadas