Symfony UX Dropzone:如何在控制器中获取上传文件?
解决Symfony UX Dropzone无法在控制器获取上传文件的问题
核心问题原因
直接用$_FILES或Request对象获取文件为空,是因为Dropzone字段属于嵌套子表单(PackageFormType)且设置了mapped=false,Symfony会将文件数据封装在表单对象的子字段中,而非直接暴露在全局变量或Request的根层级。
正确获取文件的步骤
- 遍历Ad表单中
packages对应的子表单集合(Ad与Package是一对多关联,AdFormType中应使用CollectionType嵌入PackageFormType) - 从每个Package子表单中取出
file字段的上传数据(因mapped=false,无法直接从Package实体获取)
修改后的控制器代码示例
#[Route('/envoyer-un-colis', name: 'app_ad')] public function index(Request $request): Response { $ad = new Ad; $package = new Package; $package->setQuantity(1); $ad->getPackages()->add($package); $form = $this->createForm(AdFormType::class, $ad); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // 遍历每个Package子表单,获取上传文件 /** @var FormInterface $packageForm */ foreach ($form->get('packages') as $packageForm) { // 获取Dropzone上传的文件数组(multiple=true,返回数组) $uploadedFiles = $packageForm->get('file')->getData(); if (!empty($uploadedFiles)) { foreach ($uploadedFiles as $file) { // 处理单个文件,例如移动到目标目录 // $file->move($targetDirectory, $fileName); dump($file); // 测试查看文件信息 } } } if ($this->getUser()) { foreach($ad->getPackages() as $package) { $package->setAd($ad); } $ad->setCreatedAt(new \DateTime()); $ad->setUser($this->getUser()); $this->em->persist($ad); $this->em->flush(); return $this->redirectToRoute('app_bravo'); } else { return $this->redirectToRoute('app_login'); } } return $this->render('ad/index.html.twig', [ 'form' => $form, ]); }
额外注意事项
- 确保Twig模板中使用
{{ form_start(form) }}渲染表单,Symfony会自动添加enctype="multipart/form-data"属性(文件上传必填) - 检查php.ini配置:
upload_max_filesize和post_max_size的值是否足够容纳上传文件大小 - 确认Dropzone前端未阻止表单默认提交行为,或配置的
formAction与控制器路由一致
内容的提问来源于stack exchange,提问作者MikaelHdx
相关产品推荐
相关产品推荐

