ЧИТАТИ ОСТАННЯ ПЕРШОГО ПАРА ТУТ!
Я знаю, що це на 3 роки занадто пізно, але відповідь Метта (прийнята) не є повною, і врешті-решт у вас виникнуть проблеми. Ключовим тут є те, що якщо ви вирішили використовувати multipart/form-data
, межа не повинна відображатися у файлових даних, які сервер врешті отримує.
Це не проблема application/x-www-form-urlencoded
, тому що немає меж. x-www-form-urlencoded
також завжди може обробляти двійкові дані, за допомогою простого доцільного перетворення одного довільного байта в три 7BIT
байти. Неефективна, але вона працює (зауважте, що коментар про неможливість надсилання імен файлів, а також бінарних даних невірний; ви просто надсилаєте їх як іншу пару ключів / значень).
Проблема multipart/form-data
полягає в тому, що розділовий пристрій не повинен бути присутнім у файлових даних (див. RFC 2388 ; розділ 5.2, також містить досить кульгавий привід для відсутності належного сукупного типу MIME, що дозволяє уникнути цієї проблеми).
Отже, на перший погляд, не multipart/form-data
має жодної цінності у будь-якому завантаженні файлів, бінарному чи іншому. Якщо ви не вибрали кордон правильно, то з часом у вас виникне проблема, чи ви надсилаєте звичайний текст чи необроблений бінарний файл - сервер знайде межу в неправильному місці, а ваш файл буде усічений або POST не вдасться.
Ключ полягає у виборі кодування та межі, щоб вибрані граничні символи не могли відображатися у кодованому виході. Одне просте рішення - це використання base64
( не використовуйте сирі двійкові). У base64 3 довільні байти кодуються чотирма 7-бітовими символами, де набір вихідних символів [A-Za-z0-9+/=]
(тобто буквено-цифрові символи, '+', '/' або '='). =
є окремим випадком і може з’являтися лише в кінці кодованого виводу, як одинарний, =
або як подвійний ==
. Тепер виберіть свою межу як 7-бітну рядок ASCII, яка не може відображатися у base64
висновку. Багато варіантів, які ви бачите в мережі, не проходять цей тест - MDN формує документинаприклад, використовувати "blob" в якості межі при надсиланні двійкових даних - не добре. Однак щось на кшталт "! Blob!" ніколи не з’явиться у base64
виході.