Symfony 3 控制器或 FormBuilder 中的最大文件大小上传约束
Symfony 3 Maximum File Size Upload Constraint in Controller or FormBuilder
此控制器需要在处理之前检查通过 Symfony 中的 FileType FormBuilder 上传的文件是否大于 128M。
我尝试在 formbuilder 中使用约束,但没有成功。
目标是在从用户上传的文件中下载之前验证大小。
FormBuilder
<?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 会拒绝太大的文件,但是它在处理请求时仍然会下载它,这是一个问题
我们以某种方式找到了使用 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.
此控制器需要在处理之前检查通过 Symfony 中的 FileType FormBuilder 上传的文件是否大于 128M。 我尝试在 formbuilder 中使用约束,但没有成功。
目标是在从用户上传的文件中下载之前验证大小。
FormBuilder
<?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 会拒绝太大的文件,但是它在处理请求时仍然会下载它,这是一个问题
我们以某种方式找到了使用 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.