首页 > 解决方案 > 控制器或 FormBuilder 中的 Symfony 3 最大文件大小上传约束

问题描述

该控制器在处理之前需要检查通过 Symfony 中的 FileType FormBuilder 上传的文件是否大于 128M。我尝试在表单生成器中使用约束,但没有成功。

目标是在从用户上传的下载之前验证大小。

表单生成器

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use AppBundle\Entity\AdmCompteSessionRepository;

class UploadType extends AbstractType implements ContainerAwareInterface
{
    use ContainerAwareTrait;

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('fichier_ine', FileType::class, array('required' => false))
            ->add('sendfile', SubmitType::class, ['label' => 'Vérifier les numéros'])
        ;
    }
}

控制器

    public function searchFormAction(Request $request)
    {
        $form = $this->createForm('AppBundle\Form\SearchType');
        $form->handleRequest($request);

        $verifyForm = $this->createForm('AppBundle\Form\VerifyType');
        $verifyForm->handleRequest($request);

        $uploadForm = $this->createForm('AppBundle\Form\UploadType');
        $uploadForm->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->get('session')->set('search', $form->getData());
            /*$admCompteSession = $form->getData()["candidat_serie_bac"];

            $admCompteSession->setNombreRech($admCompteSession->getNombreRech() + 1);
            $em = $this->getDoctrine()->getManager();
            $em->persist($admCompteSession);
            $em->flush();*/
            return $this->redirectToRoute('results');
        }

        $series = $this->getDoctrine()->getManager()
            ->getRepository('AppBundle:BacCandidatSerie')
            ->findAll();

        if ($verifyForm->isSubmitted() && $verifyForm->isValid()) {

            $ine = $verifyForm->getData(); //key "numero_ine" contains the data
            $ineValidator = new CodeValidator($ine['numero_ine']);
            if($ineValidator->testINE()){
                //print "numéro validé"
                return $this->render('default/index.html.twig', array(
                    'form' => $form->createView(),
                    'verifyForm' => $verifyForm->createView(),
                    'valid' => true,
                    'uploadForm' => $uploadForm->createView(),
                    'series' => $series,
                    'isTested' => true,
                    'isInvalid' => false
                ));
            }
            else{
                return $this->render('default/index.html.twig', array(
                    'form' => $form->createView(),
                    'verifyForm' => $verifyForm->createView(),
                    'valid' => false,
                    'uploadForm' => $uploadForm->createView(),
                    'series' => $series,
                    'isTested' => true,
                    'isInvalid' => true,
                ));
            }
        }

       if ($uploadForm->isSubmitted() && $uploadForm->isValid()) {
           $targetDirectory = $this->get('kernel')->getRootDir() . '/../var/public/';
           $fileData = $uploadForm['fichier_ine']->getData();
           $exportCSV = $targetDirectory . 'LOT_INE_' . uniqid('IT_ID_') . '_KEY_' . (string)rand() . '.csv';
           CodeValidator::batchINE($fileData, $exportCSV);

           $response = new BinaryFileResponse($exportCSV);
           $response->setContentDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT,
               'verification.csv');
           $response->deleteFileAfterSend(true);
           return $response;
       }

        return $this->render('default/index.html.twig', array(
            'form' => $form->createView(),
            'verifyForm' => $verifyForm->createView(),
            'valid' => false,
            'uploadForm' => $uploadForm->createView(),
            'series' => $series,
            'isTested' => false,
            'isInvalid' => false
        ));
    }

我想以最小的结构更改来实现这一点,而不添加任何实体(因此在 FormBuilder 或 Controller 函数中将是理想的)。Symfony 确实拒绝太大的文件,但是它在处理请求时仍然会下载它,这是一个问题

标签: phpformssymfonyupload

解决方案


我们以某种方式找到了一个使用 jQuery 的解决方案......因为 Symfony 验证在 3.1 中似乎很无聊

在 TWIG 视图中:

        $(document).ready(function () {
            $("#{{ uploadForm.fichier_ine.vars.id }}").on('change', function () {
                    if (this.files[0].size > 128000000) {
                        alert("Erreur, fichier trop volumineux. Le fichier doit peser moins de 128M");
                        this.value = "";
                    }
                }
            )
        })
    </script>```

Directly pulling the id from the Twig vars.
Hope this helps anyone with a similar issue.

推荐阅读