Нет, это не единственный способ - один из других способов - просто отправить форму с файлом. В такой форме используется тип содержимого multipart/form-data .
См. документация W3C по этому вопросу :
Тип содержимого « application/x-www-form-urlencode
d» неэффективен для отправки больших количеств двоичных данных или текста, содержащих символы, отличные от ASCII.
Тип содержимого « multipart/form-data » должен использоваться для отправки форм, содержащих файлы, данные, отличные от ASCII, и двоичные данные.
Таким образом, нет необходимости изобретать колесо - браузеры уже поддерживают отправку файлов вместе с дополнительной информацией простым способом. Вы просто создаете форму, в которой пользователь может вводить данные и выбирать файлы, а затем все они отправляются на сервер с типом содержимого multipart/form-data , и ваша веб-структура должна быть способна понять, что он касается как файлов, так и текстовых данных.