Сделал загрузку без использования форм.
В шаблоне добавил:
<input type="file" name="files[]" multiple>
В Action получаю массив с файлами и создаю объекты Image передавая файл в setFile(file), а затем добавляю объект Image в $product->images:
$images = $request->files->get('files');
foreach($images as $file) {
$image = new Image();
$image->setFile($file);
$product->addImage($image);
}
Дальше всё работает как тут:
symfony.com/doc/current/cookbook/doctrine/file_upl...
с использованием Lifecycle Callbacks.