php - 如何在 Symfony 表单中验证上传文件的名称
问题描述
这是我在 FormUploaderType 生成器中输入的“条款”
->add('terms', FileType::class, [
'constraints' => [
'pattern' => '/([a-z]+-)+[20]\d{7}\.pdf/',
'message' => 'Change the name of the file',
'mimeTypes' => [
"application/pdf",
"application/x-pdf",
],
])
我想确定,该文件的名称与我想要的完全一致(例如:'something-else-in-here-20200430.pdf')但它不起作用 - 它向我显示一条错误消息......我该如何处理?我已经从 symfony 文档中看到了 Annotation 方法以及类实体中的 loadValidatorMetadata 方法,但是它们似乎都不适用于文件上传...
解决方案
您需要实例化约束。mimeTypes
key 对应于约束File
,whilepattern
是 for Regex
。
但是,由于terms
是一个UploadedFile
,它的__toString()
方法将返回临时上传的文件名,并且检查将失败。您需要使用 aCallback
来访问该对象。
->add('terms', FileType::class, [
'constraints' => [
new Callback(function ($object, ExecutionContextInterface $context, $payload) {
$pattern = '/^([a-z]+-)+20\d{6}\.pdf$/';
if (!preg_match($pattern, $object->getClientOriginalName())) {
$context->buildViolation('Change the name of the file')
->addViolation();
}
}),
new File([
'mimeTypes' => [
"application/pdf",
"application/x-pdf",
],
]),
])
推荐阅读
- python - Python beautifulsoup 打印所需的元素
- ruby-on-rails - Rails5 如何每月发送电子邮件报告?
- sqlalchemy - Gino 引擎未初始化
- java - java.lang.IllegalArgumentException 的问题:不是托管类型
- python - 是否有任何 API 或方法可以返回我发布或发布任何技术的年份?
- javascript - Discord Bot 如何删除特定用户角色
- django - 将错误值传递给模板中的 JS 代码。姜戈
- php - AJAX 请求不显示任何数据
- javascript - 选择后如何关闭下拉菜单?
- azure-devops - 如何在 Azure Devops 中显示来自 TestResults 的标准输出