Symfony 5.4上传PNG图片时触发文件MIME类型约束报错
问题根因
表单File校验规则里配置的MIME类型值错误,PNG、JPEG属于图片类资源,正确的MIME前缀是image/而非application/,你写的application/png、application/jpeg是不存在的无效MIME标识,所有合法图片都会被判定为格式不符触发校验提示。
修复步骤
- 首先修正约束里的MIME类型配置,替换为正确值:
// Form\ProjectType.php ->add('image', FileType::class , [ "attr" => [ "class" => "form-control" ], // 注意不要传字符串"false",required配置需要接收原生布尔值 "required" => false, "mapped" => true , 'constraints' => [ new File([ 'maxSize' => '1024k', 'mimeTypes' => [ 'image/png', 'image/jpeg', ], 'mimeTypesMessage' => 'Please upload a valid JPG/PNG file', ]) ], ])
- 修复代码里的两个隐含bug,避免后续报错:
- 原代码里
"required" => "false"传的是字符串,PHP中非空字符串会被判定为布尔真值,实际等价于开启必填,必须传原生布尔值false - 原实体
setImage方法声明参数只能接收string类型,但开启mapped => true时,表单提交绑定阶段会把UploadedFile实例传入该方法,会触发类型不兼容的致命错误。两种调整方案二选一即可:- 方案1:把image字段的
mapped改为false,适配你当前控制器手动获取上传文件、处理文件名后手动调用setImage存字符串路径的逻辑,不需要修改实体代码 - 方案2:修改实体setImage方法的参数声明,兼容接收上传对象和字符串:
- 方案1:把image字段的
- 原代码里
// Entity\Project.php use Symfony\Component\HttpFoundation\File\UploadedFile; public function getImage(): ?string { return $this->image; } public function setImage(string|UploadedFile|null $image): self { if ($image instanceof UploadedFile) { return $this; } $this->image = $image; return $this; }
改完之后执行php bin/console cache:clear清除Symfony缓存,再测试上传即可正常通过校验。
内容的提问来源于stack exchange,提问作者Naan Baysa
相关产品推荐
相关产品推荐

