symfony + AJAX, как загрузить файлы, встроенные в объекты JSON Javascript? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть клиент, загружающий файлы, встроенные в объекты JSON, потому что к каждому из этих файлов прикреплены метаданные.

Проблема в том, что я не знаю, сколько файлов они будут загружать, поэтому мне нужно что-то динамическое

на данный момент у меня есть fileList объект javascript, который содержит подобъекты, которые выглядят так:

{
  file1: null
  meta1: null,
  meta2: null,
  etc...
}    
{
  file2: null
  meta1: null,
  meta2: null,
  etc...
}

Я загружаю его так:

formData.append('files', this.fileList);

но в Symfony я не знаю, как обрабатывать эту конкретную ситуацию

Если я смотрю в профилировщике, я получаю что-то вроде этого: files "[object Object],[object Object]"

и $files = $request->files->get('files'); даетnull

Есть ли другой способ декодирования данных?оно есть, но я не могу его прочитать: (

1 Ответ

0 голосов
/ 12 мая 2019

Если у вас есть файл для загрузки, по одному на строку метаданных, я бы отправил файл отдельно, когда он выбран в форме (мне нравится BlueImp для этого, но есть другие) с Ajax, и отложил его в каталог (с помощью сценария очистки, который удаляет их в возрасте 24 часов, S3 делает это красиво).Затем верните этот путь в форму, поместите его в отправляемое вами JSON-тело, затем у вас есть метаданные, в которые входит ожидающий путь к файлу.Переместите этот ожидающий файл при отправке и сохраните эту новую ссылку при сохранении строки или чего-либо еще.Вуаля.

Итак:

files[][filename].onchange: [/* Upload file to pending, return pending path */]

С обратным путем, pending/ad32sY3KJ.png, отправьте

"files": [
    ["file":"`pending/ad32sY3KJ.png`","meta1":"Root Beer"],
    ["file":"`pending/34dks3DWf.png`","meta1":"Cat"]
]

Тогда ваш обработчик маршрутизатора имеет массив, так что Content-type: application/json работаеткак и ожидалось, хотя вы бы использовали:

$body = \json_decode($request->getContent(), true);

Вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...