Для загрузки множества файлов в Swagger-Symfony есть несколько подходов, которые могут быть применены в зависимости от требований проекта. Рассмотрим несколько из них.
1. Вариант с использованием форм Symfony. В этом случае можно создать форму для выбора файлов, а затем обработать отправку формы в контроллере. Для загрузки множества файлов можно использовать поле формы типа "collection". Добавьте в вашу форму это поле следующим образом:
use SymfonyComponentFormExtensionCoreTypeCollectionType; use SymfonyComponentFormExtensionCoreTypeFileType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormFormBuilderInterface; public function buildForm(FormBuilderInterface $builder, array $options) { $builder // ... ->add('files', CollectionType::class, [ 'entry_type' => FileType::class, 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]) // ... }
Затем в контроллере обработайте отправку формы следующим образом:
use SymfonyComponentHttpFoundationRequest; public function uploadFiles(Request $request) { $form = $this->createForm(...); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $files = $form->get('files')->getData(); // получаем загруженные файлы // обработка файлов // ... } // ... }
2. Еще один вариант - использование библиотеки VichUploaderBundle, которая упрощает загрузку и управление файлами. Прежде всего, установите VichUploaderBundle:
composer require vich/uploader-bundle
Затем настройте его для вашего проекта, добавив конфигурацию в файл config/packages/vich_uploader.yaml
:
vich_uploader: db_driver: orm mappings: uploaded_files: uri_prefix: /uploads/files upload_destination: '%kernel.project_dir%/public/uploads/files' namer: VichUploaderBundleNamingUniqidNamer inject_on_load: true delete_on_remove: true
Ваша сущность Symfony должна быть настроена для работы с VichUploaderBundle. Например:
use DoctrineORMMapping as ORM; use SymfonyComponentHttpFoundationFileFile; use SymfonyComponentValidatorConstraints as Assert; use VichUploaderBundleMappingAnnotation as Vich; /** * @ORMEntity * @VichUploadable */ class MyEntity { // ... /** * @VichUploadableField(mapping="uploaded_files", fileNameProperty="fileName") * @AssertAll({ * @AssertFile( * maxSize="10M" * ) * }) */ private $files; /** * @ORMColumn(type="string", nullable=true) */ private $fileName; // ... }
Теперь вы можете создать форму, аналогичную первому варианту, и обрабатывать ее отправку в контроллере с использованием VichUploaderBundle.