php - 控制器或 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 确实拒绝太大的文件,但是它在处理请求时仍然会下载它,这是一个问题
解决方案
我们以某种方式找到了一个使用 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.
推荐阅读
- python - 从三个中找到一个最大的数字
- javascript - React - 如何访问传递的道具对象名称
- django - 密码重置链接未使用 Django 发送。即使它没有显示任何错误,但是当我检查我的电子邮件时,这里没有显示任何链接
- python - 从不同的指数分布生成新的指数分布
- angular - 角度访问 IIS 中的虚拟目录,端口为 4200
- javascript - 成功响应来自 Ajax 调用的数据后,还处理附加功能
- rust - 处理货物箱的依赖关系
- mongodb - 当需要仅提取嵌入模式的一部分时,如何在模式中构建单对多关系
- webdriver-io - Webdriverio Selenium Standalone Service v6 及更高版本 - 无法覆盖私有 Selenium 后端的主机名
- matlab - matlab 上的 findpeaks 函数背后的数学原理是什么?”