跳到内容

文件

编辑此页

验证一个值是否为有效的“文件”,可以是以下类型之一

  • 字符串(或具有 __toString() 方法的对象)指向现有文件的路径;
  • 有效的 File 对象(包括 UploadedFile 类的对象)。

此约束通常在表单中与 FileType 表单字段一起使用。

另请参阅

如果您要验证的文件是图像,请尝试 Image 约束。

适用于 属性或方法
文件
验证器 FileValidator

基本用法

此约束最常用于将在表单中呈现为 FileType 字段的属性。例如,假设您正在创建一个作者表单,您可以在其中上传作者的“简历” PDF。在您的表单中,bioFile 属性将是 file 类型。Author 类可能如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\HttpFoundation\File\File;

class Author
{
    protected File $bioFile;

    public function setBioFile(?File $file = null): void
    {
        $this->bioFile = $file;
    }

    public function getBioFile(): File
    {
        return $this->bioFile;
    }
}

为了保证 bioFile File 对象有效,并且文件大小低于某个限制且为有效的 PDF,请添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    #[Assert\File(
        maxSize: '1024k',
        extensions: ['pdf'],
        extensionsMessage: 'Please upload a valid PDF',
    )]
    protected File $bioFile;
}

bioFile 属性经过验证,以保证它是一个真实的文件。其大小和 mime 类型也经过验证,因为已指定了适当的选项。

注意

与大多数其他约束一样,null 和空字符串被视为有效值。这是为了允许它们成为可选值。如果该值是强制性的,一个常见的解决方案是将此约束与 NotBlank 结合使用。

选项

binaryFormat

类型: boolean 默认值: null

true 时,大小将以二进制前缀单位(KiB、MiB)显示在消息中。当 false 时,大小将以 SI 前缀单位(kB、MB)显示。当 null 时,binaryFormat 将从 maxSize 选项中定义的值进行猜测。

有关二进制和 SI 前缀之间差异的更多信息,请参阅 维基百科:二进制前缀

extensions

类型: arraystring

如果设置,验证器将检查底层文件的扩展名和媒体类型(以前称为 MIME 类型)是否等于给定的扩展名和关联的媒体类型(如果是字符串),或者是否存在于集合中(如果是数组)。

默认情况下,允许所有与扩展名关联的媒体类型。支持的扩展名和关联媒体类型的列表可以在 IANA 网站上找到。

也可以显式配置扩展名的授权媒体类型。

在以下示例中,为 xmltxt 扩展名显式设置了允许的媒体类型,并且允许 jpg 的所有关联媒体类型

1
2
3
4
5
[
    'xml' => ['text/xml', 'application/xml'],
    'txt' => 'text/plain',
    'jpg',
]

disallowEmptyMessage

类型: string 默认值: 不允许空文件。

此约束检查上传的文件是否为空(即 0 字节)。如果是,则显示此消息。

您可以在此消息中使用以下参数

参数 描述
{{ file }} 绝对文件路径
{{ name }} 基本文件名

groups

类型: array | string 默认值: null

它定义了此约束的验证组。阅读更多关于 验证组 的信息。

maxSize

类型: mixed

如果设置,则底层文件的大小必须低于此文件大小才能有效。文件大小可以使用以下格式之一给出

后缀 单位名称 示例
(无) 字节 1 字节 4096
k 千字节 1,000 字节 200k
M 兆字节 1,000,000 字节 2M
Ki 千比特字节 1,024 字节 32Ki
Mi 兆比特字节 1,048,576 字节 8Mi

有关二进制和 SI 前缀之间差异的更多信息,请参阅 维基百科:二进制前缀

maxSizeMessage

类型: string 默认值: 文件太大 ({{ size }} {{ suffix }})。允许的最大大小为 {{ limit }} {{ suffix }}。

如果文件大于 maxSize 选项,则显示的消息。

您可以在此消息中使用以下参数

参数 描述
{{ file }} 绝对文件路径
{{ limit }} 允许的最大文件大小
{{ name }} 基本文件名
{{ size }} 给定文件的文件大小
{{ suffix }} 使用的文件大小单位的后缀(见上文)

mimeTypes

类型: arraystring

警告

您应该始终使用 extensions 选项而不是 mimeTypes,除非您明确不希望检查文件的扩展名是否与其内容一致(这可能是一个安全问题)。

默认情况下,extensions 选项还会检查文件的媒体类型。

如果设置,验证器将检查底层文件的媒体类型(以前称为 MIME 类型)是否等于给定的 mime 类型(如果是字符串),或者是否存在于给定的 mime 类型集合中(如果是数组)。

您可以在 IANA 网站上找到现有 mime 类型的列表。

注意

当在 FileType 字段上使用此约束时,mimeTypes 选项的值也用于相关 <input type="file"> HTML 元素的 accept 属性中。

仅当使用 表单类型猜测(即,表单类型未在表单构建器的 ->add() 方法中显式定义)并且当字段未定义其自己的 accept 值时,才会应用此行为。

filenameMaxLength

类型: integer 默认值: null

如果设置,验证器将检查底层文件的文件名是否未超过特定长度。

filenameTooLongMessage

类型: string 默认值: 文件名太长。它应少于 {{ filename_max_length }} 个字符。|文件名太长。它应少于 {{ filename_max_length }} 个字符。

如果文件名超过 filenameMaxLength 选项设置的限制,则显示的消息。

您可以在此消息中使用以下参数

参数 描述
{{ filename_max_length }} 允许的最大字符数

extensionsMessage

类型: string 默认值: 文件扩展名无效 ({{ extension }})。允许的扩展名为 {{ extensions }}。

如果文件的扩展名不是 extensions 选项的有效扩展名,则显示的消息。

参数 描述
{{ extension }} 给定文件的扩展名
{{ extensions }} 允许的文件扩展名列表

mimeTypesMessage

类型: string 默认值: 文件的 mime 类型无效 ({{ type }})。允许的 mime 类型为 {{ types }}。

如果文件的媒体类型不是 mimeTypes 选项的有效媒体类型,则显示的消息。

您可以在此消息中使用以下参数

参数 描述
{{ file }} 绝对文件路径
{{ name }} 基本文件名
{{ type }} 给定文件的 MIME 类型
{{ types }} 允许的 MIME 类型列表

notFoundMessage

类型: string 默认值: 找不到文件。

如果在给定路径找不到文件,则显示的消息。仅当底层值是字符串路径时才可能发生此错误,因为 File 对象无法使用无效的文件路径构建。

您可以在此消息中使用以下参数

参数 描述
{{ file }} 绝对文件路径

notReadableMessage

类型: string 默认值: 文件不可读。

如果文件存在,但 PHP is_readable() 函数在传递文件路径时失败,则显示的消息。

您可以在此消息中使用以下参数

参数 描述
{{ file }} 绝对文件路径

payload

类型: mixed 默认值: null

此选项可用于将任意特定于域的数据附加到约束。配置的有效负载不会被 Validator 组件使用,但其处理完全取决于您。

例如,您可能希望使用 多个错误级别,以便根据错误严重性在前端以不同方式呈现失败的约束。

uploadCantWriteErrorMessage

类型: string 默认值: 无法将临时文件写入磁盘。

如果上传的文件无法存储在临时文件夹中,则显示的消息。

此消息没有参数。

uploadErrorMessage

类型: string 默认值: 文件无法上传。

如果由于某些未知原因无法上传上传的文件,则显示的消息。

此消息没有参数。

uploadExtensionErrorMessage

类型: string 默认值: PHP 扩展导致上传失败。

如果 PHP 扩展导致文件上传失败,则显示的消息。

此消息没有参数。

uploadFormSizeErrorMessage

类型: string 默认值: 文件太大。

如果上传的文件大于 HTML 文件输入字段允许的大小,则显示的消息。

此消息没有参数。

uploadIniSizeErrorMessage

类型: string 默认值: 文件太大。允许的最大大小为 {{ limit }} {{ suffix }}。

如果上传的文件大于 upload_max_filesize php.ini 设置,则显示的消息。

您可以在此消息中使用以下参数

参数 描述
{{ limit }} 允许的最大文件大小
{{ suffix }} 使用的文件大小单位的后缀(见上文)

uploadNoFileErrorMessage

类型: string 默认值: 没有文件被上传。

如果没有文件被上传,则显示的消息。

此消息没有参数。

uploadNoTmpDirErrorMessage

类型: string 默认值: php.ini 中未配置临时文件夹。

如果 php.ini 设置 upload_tmp_dir 丢失,则显示的消息。

此消息没有参数。

uploadPartialErrorMessage

类型: string 默认值: 文件仅被部分上传。

如果上传的文件仅被部分上传,则显示的消息。

此消息没有参数。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本