文件
验证一个值是否为有效的“文件”,可以是以下类型之一
- 字符串(或具有
__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
类型: array
或 string
如果设置,验证器将检查底层文件的扩展名和媒体类型(以前称为 MIME 类型)是否等于给定的扩展名和关联的媒体类型(如果是字符串),或者是否存在于集合中(如果是数组)。
默认情况下,允许所有与扩展名关联的媒体类型。支持的扩展名和关联媒体类型的列表可以在 IANA 网站上找到。
也可以显式配置扩展名的授权媒体类型。
在以下示例中,为 xml
和 txt
扩展名显式设置了允许的媒体类型,并且允许 jpg
的所有关联媒体类型
1 2 3 4 5
[
'xml' => ['text/xml', 'application/xml'],
'txt' => 'text/plain',
'jpg',
]
disallowEmptyMessage
类型: string
默认值: 不允许空文件。
此约束检查上传的文件是否为空(即 0 字节)。如果是,则显示此消息。
您可以在此消息中使用以下参数
参数 | 描述 |
---|---|
{{ file }} |
绝对文件路径 |
{{ name }} |
基本文件名 |
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
类型: array
或 string
警告
您应该始终使用 extensions
选项而不是 mimeTypes
,除非您明确不希望检查文件的扩展名是否与其内容一致(这可能是一个安全问题)。
默认情况下,extensions
选项还会检查文件的媒体类型。
如果设置,验证器将检查底层文件的媒体类型(以前称为 MIME 类型)是否等于给定的 mime 类型(如果是字符串),或者是否存在于给定的 mime 类型集合中(如果是数组)。
您可以在 IANA 网站上找到现有 mime 类型的列表。
注意
当在 FileType 字段上使用此约束时,mimeTypes
选项的值也用于相关 <input type="file">
HTML 元素的 accept
属性中。
仅当使用 表单类型猜测(即,表单类型未在表单构建器的 ->add()
方法中显式定义)并且当字段未定义其自己的 accept
值时,才会应用此行为。
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 组件使用,但其处理完全取决于您。
例如,您可能希望使用 多个错误级别,以便根据错误严重性在前端以不同方式呈现失败的约束。
uploadIniSizeErrorMessage
类型: string
默认值: 文件太大。允许的最大大小为 {{ limit }} {{ suffix }}。
如果上传的文件大于 upload_max_filesize
php.ini
设置,则显示的消息。
您可以在此消息中使用以下参数
参数 | 描述 |
---|---|
{{ limit }} |
允许的最大文件大小 |
{{ suffix }} |
使用的文件大小单位的后缀(见上文) |
uploadNoTmpDirErrorMessage
类型: string
默认值: php.ini 中未配置临时文件夹。
如果 php.ini 设置 upload_tmp_dir
丢失,则显示的消息。
此消息没有参数。