LEGGI QUI AL PRIMO PARA QUI!
So che sono 3 anni troppo tardi, ma la risposta (accettata) di Matt è incompleta e alla fine ti metterà nei guai. La chiave qui è che, se si sceglie di utilizzare multipart/form-data
, il limite non deve apparire nei dati del file che il server alla fine riceve.
Questo non è un problema application/x-www-form-urlencoded
, perché non ci sono confini. x-www-form-urlencoded
può anche gestire sempre dati binari, con la semplice opportunità di trasformare un byte arbitrario in tre 7BIT
byte. Inefficiente, ma funziona (e nota che il commento sulla non possibilità di inviare nomi di file e dati binari non è corretto; devi semplicemente inviarlo come un'altra coppia chiave / valore).
Il problema multipart/form-data
è che il separatore di confine non deve essere presente nei dati del file (vedere RFC 2388 ; la sezione 5.2 include anche una scusa piuttosto scadente per non avere un tipo MIME aggregato adeguato che eviti questo problema).
Quindi, a prima vista, multipart/form-data
non ha alcun valore in nessun caricamento di file, binario o altro. Se non si sceglie correttamente il limite, alla fine si verificherà un problema, indipendentemente dal fatto che si invii testo semplice o binario non elaborato: il server troverà un limite nel posto sbagliato e il file verrà troncato o il POST avrà esito negativo.
La chiave è scegliere una codifica e un limite in modo tale che i caratteri di confine selezionati non possano apparire nell'output codificato. Una soluzione semplice è quella di utilizzare base64
( non utilizzare binari grezzi). In base64 3 byte arbitrari sono codificati in quattro caratteri a 7 bit, in cui il set di caratteri di output è [A-Za-z0-9+/=]
(ovvero caratteri alfanumerici, '+', '/' o '='). =
è un caso speciale e può apparire solo alla fine dell'output codificato, come singolo =
o doppio ==
. Ora, scegli il confine come una stringa ASCII a 7 bit che non può apparire base64
nell'output. Molte scelte che vedi in rete non superano questo test: MDN forma documenti, ad esempio, utilizzare "BLOB" come limite quando si inviano dati binari - non va bene. Tuttavia, qualcosa come "! Blob!" non apparirà mai in base64
output.