php - Symfony 表单不向控制器发送文件
问题描述
你好,我是 symfony 的新手,我必须和他一起做一个 CRUD 产品。我必须将此信息发送到数据库:
- 标题(字符串,必填,最小长度:6);
- 描述(文本,最大长度:4000)
- 图像(blob,必需,最大文件大小:5mb,仅类型:JPG、PNG、GIF);
- 库存(int,必需);
问题:
- 大于 1mb 的文件不会通过表单发送;
观察:
- 如果文件有 1mb 或更少,则表格会正确发送。
我的实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
*/
class Product {
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\Column(type="text", length=4000, nullable=true)
*/
private $description;
/**
* @ORM\Column(type="blob")
*/
private $image;
/**
* @ORM\Column(type="integer")
*/
private $stock;
我的表格由以下人员生成:
$product = new Product();
$form = $this->createFormBuilder($product)
->add('title',TextType::class, [
'required' => true,
'label' => 'Titulo: ',
'attr' => ['minlength' => 6, 'id' => 'title_product'],
])
->add('description', TextareaType::class,[
'required' => false,
'label' => 'Descrição: ',
'attr' => ['maxlength' => 4000, 'id' => 'description_product'],
])
->add('image', FileType::class, [
'required' => true,
'attr' => ['accept' => 'image/jpeg, image/png, image/gif'],
'label' => 'Imagem do produto(JPG, PNG ou GIF): ',
'help' => 'A imagem deve ter um peso maximo de 5 MBs.',
])
->add('stock', IntegerType::class, [
'required' => true,
'label' => 'Quantidade em estoque: ',
])
->add('save', SubmitType::class, [
'label' => 'Criar Produto',
'attr' => ['class' => 'btn btn-success']
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$product = $form->getData();
if ($this->validateFormProduct($product)){
$this->createProduct($product);
return $this->redirectToRoute('index_products');
}
}
return $this->render('product/new.html.twig', [
'form' => $form->createView()
]);
验证功能:
private function invalidImageType($img) {
$permitedTypes = array(IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF);
$detectedType= exif_imagetype($img);
return !in_array($detectedType, $permitedTypes);
}
private function invalidImageSize($img) {
return filesize($img) > 5000000;
}
private function validateFormProduct($form){
if ($this->invalidImageType($form->getImage())){
$this->addFlash(
'warning',
'Tipo de imagem invalido!'
);
return false;
}
if ($this->invalidImageSize($form->getImage())){
$this->addFlash(
'warning',
'Este arquivo excede o tamanho maximo de 5mb!'
);
return false;
}
return true;
}
函数加密:
private function encriptImage($img) {
$normalizer = new DataUriNormalizer();
return $normalizer->normalize(new \SplFileObject($img));
}
解决方案
您需要在php.ini
配置文件中增加最大上传大小。
两者upload_max_filesize
和post_max_size
确保第二个大于或等于第一个。
推荐阅读
- vue.js - 如何修复 axios 中的“TypeError:name.toUpperCase 不是函数”
- asp.net-core - 使用包含花时间加载性能问题
- python - 全局变量不会改变
- c# - C# 通过引用分配属性
- yocto - Yocto 错误:函数失败:SYSTEMD_SERVICE_package 值 myservice.service 不存在
- windows - Golang fmt.Print("\033c") 和 fmt.Print("\x1bc") 没有清除屏幕(ANSI Escape 代码不起作用)如何解决?
- gnuplot - Gnuplot:如何从数据文件中读取一个文本字符串?
- javascript - 最初使 react-bootstrap 警报不可见
- matlab - 测试一个滑动区间内的中点是否为最大值
- python - Python PermissionError Errno 13 when creating file