我正在尝试通过两种条件验证文件上传:
仅允许上传图像文件或PDF文件
图像文件的最大宽度为160px,PDF文件不需要宽度
我使用了Symfony的“约束”,但是当我上传PDF文件时,它说了
此文件不是有效的图像。
因为我同时使用了Assert \ Image和Assert \ File,所以它将首先检查文件是否为图像。
但是我想要的是,当我上传文件时,它将首先检查Assert \ File。如果是图像,则将检查Assert \ Image。我该怎么办?
这是我在Entity的代码:
/**
* @Vich\UploadableField(mapping="ad", fileNameProperty="imageFile")
* @var File
* @Assert\File(
* mimeTypes = {"application/pdf", "application/x-pdf", "image/png", "image/jpeg", "image/svg+xml"},
* mimeTypesMessage = "You can only be allowed to upload Image file or PDF file"
* )
* @Assert\Image(
* maxWidth = 160
* )
*/
private $image;
答案 0 :(得分:1)
您可以做的是创建“自定义验证”约束,并使用自定义逻辑在此处检查文件或图像的类型。
https://symfony.com/doc/current/validation/custom_constraint.html
答案 1 :(得分:0)
另一种方法可能是在表单事件中进行检查
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints as Assert;
private $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Add the fields
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
if (// check mimetype of $data['image'] is an image) {
$imageConstraint = new Assert\Image(['maxWidth' => 160]);
$errors = $this->validator->validate($data['image'], $imageConstraint);
if ($errors) {
/** @var ConstraintViolation $error */
foreach ($errors as $error) {
$event->getForm()->get('image')->addError(new FormError($error->getMessage()));
}
}
}
});
}