Как загрузить файл через JSON-RPC, если в JSON нет типа для файла
otezvikentiy 19 минут назад Как загрузить файл через JSON-RPC, если в JSON нет типа для файла Средний 4 мин 522 PHP * Symfony * Обзор В JSON нет представления для файла. Есть строки, числа, массивы, объекты - и всё....
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: otezvikentiy 19 минут назад Как загрузить файл через JSON-RPC, если в JSON нет типа для файла Средний 4 мин 522 PHP * Symfony * Обзор В JSON нет представления для файла. Есть строки, числа, массивы, объекты - и всё. Поэтому любой JSON-RPC API рано или поздно упирается в вопрос: а как принять загрузку файла - фото, скан, PDF - если сам протокол бинарные данные не умеет?
Стандартный ответ: не принимать. Файл уезжает отдельным «обычным» контроллером, который читает $request->files, а рядом живёт JSON-RPC для всего остального. И вот у вас снова тот самый разброс ad hoc эндпоинтов, ради устранения которого JSON-RPC и брали.
Технические детали
В otezvikentiy/json-rpc-api 5. 2 появился другой ответ. И интереснее самой фичи - то, как она появилась: её принёс не я, а внешний контрибьютор.
Я веду этот бандл почти три года и до сих пор один, поэтому релиз, в котором главное написал не я, для меня событие особого рода. Но обо всём по порядку. ЗадачаФормулировка из issue #8, дословно по сути: два сервиса обмениваются сканами изображений плюс структурированными метаданными (tenant, station, session) в одном вызове - что-то вроде captures.
create(tenantId, stationId, image). Сегодня image невозможно выразить как параметр JSON-RPC метода, поэтому такой вызов приходится выносить из бандла в отдельный multipart-контроллер. Хочется, чтобы метод просто объявил параметр типа UploadedFile и получил файл - как любой другой параметр.
Отраслевые последствия
Решение: multipart как транспортный адаптерКлючевая идея - не трогать ядро. multipart/form-data запрос нормализуется в тот же самый конверт JSON-RPC, что и обычный, только с объектами UploadedFile уже внутри params. Всё, что ниже транспорта - гидрация, батчи, валидация - о multipart не знает вообще, ровно как оно не знает, что payload GET-запроса приехал из query string.
Форма запроса: одно текстовое поле jsonrpc несёт полный JSON-RPC конверт строкой (все скалярные параметры - внутри него), а каждая остальная часть - файл, и имя части равно имени параметра. curl -X POST \ -F 'jsonrpc={"jsonrpc":"2. 0","method":"captures.
create","params":{"tenantId":"t-1"},"id":1}' \ -F 'image=@scan. png' Метод объявляет параметр обычным свойством DTO:use Symfony\Component\HttpFoundation\File\UploadedFile; final class И читает файл в хендлере как настоящий UploadedFile - с move(), getClientOriginalName(), всем набором Symfony. Три решения, которые стоит объяснитьСкаляры не превращаются в поля формы.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






