【问题标题】:How do I validate the name of the uploaded file in Symfony Forms如何在 Symfony 表单中验证上传文件的名称
【发布时间】:2020-08-08 03:15:25
【问题描述】:

这是我在 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 方法,但它们似乎都不适用于文件上传...

【问题讨论】:

  • 你能提供给我们这个错误信息吗?

标签: php forms symfony validation file-upload


【解决方案1】:

您需要实例化约束。 mimeTypes 键对应File 约束,而pattern 对应Regex

但是,由于termsUploadedFile,其__toString() 方法将返回临时上传的文件名,检查将失败。您需要使用 Callback 来访问该对象。

->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",
            ],
        ]),
])

【讨论】:

  • 我已经把代码改成了你的,但是 symfony 怎么知道文件名呢? getClientOriginalName() 方法位于扩展 File 的 UploadedFile 类中。我应该实例化这个类并将其导入到我创建这些约束的文件中吗?
  • @Klekseusz 不,根据定义,形式中的FileTypeUploadedFile。我试过这个并且工作正常,你有没有看到任何具体的错误?如果您想要 IDE 完成,则添加 @var 注释。如果您的用例不同于“如果名称不符合,在文件上传时提供错误”,那么此方法将不起作用,因为您无法设置input[file] 的初始值。
  • phpstorm 告诉我在我的 FormUploaderType 中找不到方法 'getClientOriginalName' 所以我想知道是否应该实例化这个 File 类...
  • @Klekseusz 只需键入提示参数应该让每个人都开心:function(UploadedFile $object, ...)
  • 代码运行正常,没有任何错误,但在正确的文件名称下验证仍然失败。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2017-05-17
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多