首页 > 解决方案 > 如何在 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 方法,但是它们似乎都不适用于文件上传...

标签: phpformssymfonyvalidationfile-upload

解决方案


您需要实例化约束。mimeTypeskey 对应于约束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",
            ],
        ]),
])

推荐阅读