第2章-表格验证
在第一章中,我们学习了如何创建和显示基本的联系表单。在本章中,您将学习如何管理表单验证。
开始之前
在第1章中创建的联系表单还没有完全功能。如果用户提交了无效的电子邮件地址,或者用户提交的消息为空,会发生什么?在这些情况下,我们希望显示错误消息,要求用户更正输入,如图2-1所示。
图2-1 -显示错误信息
下面是要为联系人表单实现的验证规则:
的名字
:可选电子邮件
:必选项,必须是有效的邮箱地址主题
:必填项,所选值必须对值列表有效消息
:必须,消息长度至少为4个字符
请注意
为什么我们需要验证主题
场吗?的<选择>
标签已经将用户与预定义的值绑定。一般用户只能选择显示的选项之一,但是可以使用Firefox开发人员工具栏等工具提交其他值,或者使用类似工具模拟请求旋度
或wget
.
清单2-1显示了我们在第一章中使用的模板。
清单2-1 -联系
表单模板
/ /应用程序/前端/模块/ /模板/ indexSucces.php联系<表单动作=“< ?PHP echo url_for('联系人/索引')?>"方法=“职位”表> > <<?php回声美元的形式? >. / “2”> <输入类型=“提交”/>
图2-2分解了应用程序和用户之间的交互。第一步是将表单呈现给用户。当用户提交表单时,要么输入是有效的,用户被重定向到感谢页面,要么输入包含无效值,表单将再次显示,并显示错误消息。
图2-2应用程序与用户交互
验证器
syob娱乐下载mfony的形式是由场组成的。正如我们在第1章中观察到的那样,每个字段都可以用唯一的名称标识。我们将一个小部件连接到每个字段,以便将其显示给用户,现在让我们看看如何将验证规则应用到每个字段。
的sfValidatorBase
类
类继承的对象完成对每个字段的验证sfValidatorBase
类。为了验证联系人表单,我们必须为以下四个字段分别定义验证器对象:的名字
,电子邮件
,主题
,消息
.清单2-2显示了这些验证器在表单类中的实现setValidators ()
方法。
清单2-2 -将Validators添加到ContactForm
类
/ / lib /形式/ ContactForm.class.php类ContactForm扩展标识{受保护的静态美元的科目=数组(“主题”,“B”主题,“C”主题);公共函数配置(){这个美元->setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“主题”= >新sfWidgetFormSelect(数组(“选择”= > self::美元的科目)),“消息”= >新sfWidgetFormTextarea(),));这个美元->widgetSchema->setNameFormat(“接触(% s)”);这个美元->setValidators(数组(“名字”= >新sfValidatorString(数组(“要求”= >假)),“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4)),));}}
我们使用三个不同的验证器:
sfValidatorString
:验证字符串sfValidatorEmail
:使邮件生效sfValidatorChoice
:验证来自预定义的选项列表的输入值
每个验证器接受一个选项列表作为第一个参数。与小部件一样,这些选项中有些是强制性的,有些是可选的。例如,sfValidatorChoice
Validator有一个强制选项,选择
.每个验证器也可以接受这些选项要求
而且修剪
中默认定义的sfValidatorBase
类:
选项 | 默认值 | 描述 |
---|---|---|
要求 | 真正的 |
指定该字段是否为必填项 |
修剪 | 假 |
在验证发生之前,自动删除字符串开头和结尾的空白 |
让我们看看刚才使用的验证器的可用选项:
验证器 | 强制性的选项 | 可选选项 |
---|---|---|
sfValidatorString | max_length |
|
min_length |
||
sfValidatorEmail | 模式 |
|
sfValidatorChoice | 选择 |
如果尝试提交带有无效值的表单,则不会看到行为中的任何变化。我们必须更新联系
模块来验证所提交的值,如清单2-3所示。
清单2-3 -在联系
模块
类contactActions扩展sfActions{公共函数executeIndex(美元的请求){这个美元->形式=新ContactForm();如果(美元的请求->isMethod(“职位”)){这个美元->形式->绑定(美元的请求->getParameter(“接触”));如果(这个美元->形式->isValid()){这个美元->重定向(“接触/谢谢吗?”.http_build_query(这个美元->形式->getvalue()));}}}公共函数executeThankyou(){}}
清单2-3引入了许多新概念:
在首字母的情况下
得到
请求时,表单被初始化并传递给模板以显示给用户。表单然后在初始状态:这个美元->形式=新ContactForm();
当用户使用
帖子
请求,bind ()
方法将表单与用户输入数据绑定并触发验证机制。然后表单变为a束缚态.如果(美元的请求->isMethod(“职位”)){这个美元->形式->绑定(美元的请求->getParameter(“接触”));
绑定表单之后,可以使用
isValid ()
方法:如果返回值为
真正的
,该表格有效,用户可以被重定向到感谢页面:如果(这个美元->形式->isValid()){这个美元->重定向(“接触/谢谢吗?”.http_build_query(这个美元->形式->getvalue()));}
如果没有,
indexSuccess
模板显示为初始化。验证过程将错误消息添加到要显示给用户的表单中。
请注意
当表单处于初始状态时,isValid ()
方法总是返回假
和getvalue ()
方法将始终返回空数组。
图2-3显示了在应用程序和用户交互期间执行的代码。
图2-3 -应用程序和用户交互过程中执行的代码
验证器的目的
您可能已经注意到,在重定向到感谢页面期间,我们没有使用请求- > getParameter(接触)
但$ this - >形式> getvalue ()
.事实上,请求- > getParameter(接触)
时返回用户数据$ this - >形式> getvalue ()
返回经过验证的数据。
如果表单是有效的,为什么这两个语句不能完全相同?每个验证器实际上有两个任务验证任务,但也是一个清洁任务.的getvalue ()
方法实际上是返回经过验证和清理的数据。
清洗过程主要有两个动作:归一化而且转换输入数据的。
我们已经讲过一个数据规范化的例子修剪
选择。但是,规范化操作对于例如日期字段来说要重要得多。的sfValidatorDate
验证日期。这个验证器接受很多格式的输入(时间戳、基于正则表达式的格式等等)。类中默认情况下转换输入值,而不是简单地返回输入值Y-m-d H:我:s
格式。因此,不管输入格式的质量如何,开发人员都可以保证获得稳定的格式。该系统为用户提供了很大的灵活性,并确保了开发人员的一致性。
现在,考虑一个转换操作,比如文件上传。文件验证可以使用sfValidatorFile
.文件上传后,验证器返回的不是文件名,而是sfValidatedFile
对象,使其更容易处理文件信息。我们将在本章后面看到如何使用这个验证器。
提示
的getvalue ()
方法返回所有经过验证和清理的数据的数组。但是由于只检索一个值有时是有帮助的,所以还有一个getValue ()
方法:$email = $this->form->getValue('email')
.
无效的表单
每当表单中有无效字段时,indexSuccess
显示模板。图2-4显示了当我们提交一个包含无效数据的表单时得到的结果。
图2-4 -无效表单
调用<?PHP echo $form ?>
语句会自动考虑与字段关联的错误消息,并自动填充用户清洗过的输入数据。
类将表单绑定到外部数据时bind ()
方法,则表单将切换到绑定状态,并触发以下操作:
执行验证过程
错误消息存储在表单中,以便模板可以使用
表单的默认值将被替换为用户清洗过的输入数据
控件可以轻松获得显示错误消息或用户输入数据所需的信息形式
变量。
谨慎
如第一章所述,我们可以将默认值传递给表单类构造函数。在提交无效表单之后,这些默认值将被提交的值覆盖,以便用户可以纠正他们的错误。所以,永远不要像这个例子中那样使用输入数据作为默认值:$ this - >形式> setDefaults(请求- > getParameter(“接触”))
.
验证器定制
定制错误消息
正如您在图2-4中所注意到的,错误消息并没有真正的用处。让我们看看如何定制它们以使其更加直观。
每个验证器都可以向表单添加错误。错误由错误代码和错误消息组成。每个验证器至少有要求
而且无效的
定义在sfValidatorBase
:
代码 | 消息 | 描述 |
---|---|---|
要求 | 必需的。 |
该字段为必填项,值为空 |
无效的 | 无效的。 |
字段无效 |
下面是与我们已经使用过的验证器相关的错误代码:
验证器 | 错误代码 |
---|---|
sfValidatorString | max_length |
min_length |
|
sfValidatorEmail | |
sfValidatorChoice |
定制错误消息可以通过在创建验证对象时传递第二个参数来实现。清单2-4自定义了一些错误消息,图2-5显示了自定义错误消息的实际操作。
清单2-4 -定制错误消息
类ContactForm扩展标识{受保护的静态美元的科目=数组(“主题”,“B”主题,“C”主题);公共函数配置(){/ /……这个美元->setValidators(数组(“名字”= >新sfValidatorString(数组(“要求”= >假)),“电子邮件”= >新sfValidatorEmail(数组(),数组(“无效”= >“电子邮件地址无效。”)),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4),数组(“要求”= >“消息字段是必需的。”)),));}}
图2-5 -自定义错误信息
图2-6显示了如果您试图提交一个太短的消息(我们将最小长度设置为4个字符),您将得到的错误消息。
图2-6—Too short Message Error . (Too short Message Error .
与此错误代码相关的默认错误消息(min_length
)与我们已经讨论过的消息不同,因为它实现了两个动态值:用户输入数据(喷火
)和该字段允许的最小字符数(4
).清单2-5使用这些动态值定制该消息,结果如图2-7所示。
清单2-5 -使用动态值自定义错误消息
类ContactForm扩展标识{公共函数配置(){/ /……这个美元->setValidators(数组(“名字”= >新sfValidatorString(数组(“要求”= >假)),“电子邮件”= >新sfValidatorEmail(数组(),数组(“无效”= >“电子邮件地址无效。”)),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4),数组(“要求”= >'消息字段是必需的',“min_length”= >“消息' %value% '太短。它必须至少为%min_length%字符。,)),));}}
图2-7 -自定义动态值错误消息
每个错误消息都可以使用动态值,用百分比字符(%
).可用值通常为用户输入数据(价值
)和与错误相关的验证器的选项值。
提示
如果您想查看验证器的所有错误代码、选项和默认消息,请参阅API在线文档(欧宝官网下载app/ api / 1 _2 /).其中详细描述了每个代码、选项和错误消息,以及默认值(例如sfValidatorString
验证器API可在/ api / 1 _2 / sfValidatorString).
验证器安全
默认情况下,只有当用户提交的每个字段都有验证器时,表单才有效。这确保了每个字段都有其验证规则,并且不可能为表单中未定义的字段注入值。
为了帮助理解这个安全规则,让我们考虑一个用户对象,如清单2-6所示。
清单2-6 - The用户
类
类用户{受保护的美元的名字=”,is_admin美元=假;公共函数setFields(美元的字段){如果(收取(美元的字段[“名字”])){这个美元->的名字=美元的字段[“名字”];}如果(收取(美元的字段[“is_admin”])){这个美元->is_admin=美元的字段[“is_admin”];}}/ /……}
一个用户
对象由两个属性组成,用户名(的名字
),以及存储管理员状态的布尔值(is_admin
).的setFields ()
方法更新两个属性。清单2-7显示了与用户
类,允许用户修改的名字
财产。
清单2-7 -用户
形式
类UserForm扩展标识{公共函数配置(){这个美元->setWidgets(数组(“名字”= >新sfWidgetFormInputString()));这个美元->widgetSchema->setNameFormat(“用户(% s)”);这个美元->setValidators(数组(“名字”= >新sfValidatorString()));}}
清单2-8显示了用户
模块使用先前定义的表单,允许用户修改名称字段。
清单2-8 -用户
模块的实现
类userActions扩展sfActions{公共函数executeIndex(美元的请求){这个美元->形式=新UserForm();如果(美元的请求->isMethod(“职位”)){这个美元->形式->绑定(美元的请求->getParameter(“用户”));如果(这个美元->形式->isValid()){$ user=//检索当前用户$ user->setFields(这个美元->形式->getvalue());这个美元->重定向('...');}}}}
的值提交的表单,则不需要任何保护的名字
场,也为之is_admin
字段,那么我们的代码是脆弱的。使用Firebug这样的工具很容易完成。事实上,is_admin
Value总是有效的,因为该字段在表单中没有与之关联的任何验证器。不管这个值是多少setFields ()
方法将不仅更新的名字
财产,也是is_admin
财产。
如果测试这段代码,则为的名字
而且is_admin
fields,你会得到一个"Extra field name."全局错误,如图2-8所示。系统生成了一个错误,因为一些提交的字段没有与自己关联的任何验证器;的is_admin
属性中未定义UserForm
的形式。
图2-8 - Missing Validator Error
到目前为止,我们看到的所有验证器都会生成与字段相关的错误。这种全球性的错误从何而来?当我们使用setValidators ()
方法,symfoob娱乐下载ny创建一个sfValidatorSchema
对象。的sfValidatorSchema
定义验证器的集合。呼唤setValidators ()
等价于以下代码:
这个美元->setValidatorSchema(新sfValidatorSchema(数组(“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4)),)));
的sfValidatorSchema
默认情况下启用两个验证规则以保护验证器集合。属性可以配置这些规则allow_extra_fields
而且filter_extra_fields
选项。
的allow_extra_fields
选项,设置为假
默认情况下,检查每个用户输入的数据是否有一个验证器。如果不是,则抛出"Extra field name."全局错误,如前面的示例所示。在开发时,如果开发人员忘记显式验证字段,就会收到警告。
让我们回到联系表格上。的方法来更改验证规则的名字
字段变为必填字段。的默认值要求
选择是真正的
,我们可以改变的名字
验证器:
nameValidator美元=新sfValidatorString();
这个验证器没有影响,因为它没有min_length
也不是一个max_length
选择。在这种情况下,我们也可以用一个空的验证器替换它:
nameValidator美元=新sfValidatorPass();
与其定义一个空的验证器,我们可以去掉它,但是前面提到的默认保护阻止我们这样做。清单2-9显示了如何使用allow_extra_fields
选择。
清单2-9 -禁用allow_extra_fields
保护
类ContactForm扩展标识{公共函数配置(){/ /……这个美元->setValidators(数组(“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4)),));这个美元->validatorSchema->setOption(“allow_extra_fields”,真正的);}}
您现在应该能够验证表单,如图2-9所示。
图2-9 -使用allow_extra_fields
设置为真正的
如果仔细观察,您将注意到,即使表单是有效的,的名字
字段在感谢页面中为空,尽管提交了任何值。事实上,这个值甚至没有在返回的数组中设置$ this - >形式> getvalue ()
.禁用allow_extra_fields
选项让我们摆脱了由于缺乏验证器而导致的错误,但是filter_extra_fields
选项,设置为真正的
默认情况下,过滤这些值,从验证过的值中删除它们。当然可以改变这种行为,如清单2-10所示。
清单2-10 -禁用filter_extra_fields
保护
类ContactForm扩展标识{公共函数配置(){/ /……这个美元->setValidators(数组(“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4)),));这个美元->validatorSchema->setOption(“allow_extra_fields”,真正的);这个美元->validatorSchema->setOption(“filter_extra_fields”,假);}}
现在您应该能够在感谢页面中验证表单并检索输入值。
我们将在第4章中看到,这些保护可以用于从表单值安全序列化Propel对象。
逻辑验证器
通过使用逻辑验证器,可以为单个字段定义多个验证器:
sfValidatorAnd
:为了有效,字段必须通过所有验证器sfValidatorOr
:为了有效,字段必须至少通过一个验证器
逻辑运算符的构造函数以一组验证器作为第一个参数。清单2-11使用sfValidatorAnd
方法将两个必需的验证器关联到的名字
字段。
清单2-11 -使用sfValidatorAnd
验证器
类ContactForm扩展标识{公共函数配置(){/ /……这个美元->setValidators(数组(/ /……“名字”= >新sfValidatorAnd(数组(新sfValidatorString(数组(“min_length”= >5)),新sfValidatorRegex(数组(“模式”= >' / (\ w-) + / ')),)),));}}
提交表单时,的名字
字段输入数据必须由至少五个字符组成而且匹配正则表达式((\ w -) +
).
由于逻辑验证器本身就是验证器,因此可以组合它们来定义高级逻辑表达式,如清单2-12所示。
清单2-12 -组合多个逻辑操作符
类ContactForm扩展标识{公共函数配置(){/ /……这个美元->setValidators(数组(/ /……“名字”= >新sfValidatorOr(数组(新sfValidatorAnd(数组(新sfValidatorString(数组(“min_length”= >5)),新sfValidatorRegex(数组(“模式”= >' / (\ w-) + / ')),)),新sfValidatorEmail(),)),));}}
全球验证器
到目前为止,我们讨论的每个验证器都与特定的字段相关联,并且一次只允许验证一个值。默认情况下,它们的行为不考虑用户提交的其他数据,但有时字段的验证取决于上下文或许多其他字段值。例如,当两个密码必须相同,或者开始日期必须在结束日期之前时,就需要全局验证器。
在这两种情况下,我们都必须使用全局验证器来验证上下文中的输入用户数据。通过分别使用预验证器或后验证器,我们可以在单个字段验证之前或之后存储全局验证器。通常使用后验证器会更好,因为数据已经被验证和清理过了,即以规范化的格式。清单2-13展示了如何使用sfValidatorSchemaCompare
验证器。
清单2-13 -使用sfValidatorSchemaCompare
验证器
这个美元->validatorSchema->setPostValidator(新sfValidatorSchemaCompare(“密码”, sfValidatorSchemaCompare::平等的,“password_again”));
从symfoob娱乐下载ny 1.2开始,您还可以使用“自然的”PHP操作符来代替sfValidatorSchemaCompare
类常量。前面的例子等价于:
这个美元->validatorSchema->setPostValidator(新sfValidatorSchemaCompare(“密码”,“= =”,“password_again”));
提示
的sfValidatorSchemaCompare
类继承自sfValidatorSchema
验证器,像每个全局验证器一样。sfValidatorSchema
本身是一个全局验证器,因为它验证整个用户输入数据,并将每个字段的验证传递给其他验证器。
清单2-14展示了如何使用单个验证器来验证开始日期是否在结束日期之前,从而定制错误消息。
清单2-14 -使用sfValidatorSchemaCompare
验证器
这个美元->validatorSchema->setPostValidator(新sfValidatorSchemaCompare(“start_date”, sfValidatorSchemaCompare::LESS_THAN_EQUAL,“end_date”,数组(),数组(“无效”= >'开始日期("%left_field%")必须在结束日期("%right_field%")之前')));
使用后验证器可以确保两个日期的比较是准确的。方法的验证不管输入使用的是什么日期格式start_date
而且end_date
字段将始终转换为类似格式的值(Y-m-d H:我:s
默认情况下)。
默认情况下,预验证器和后验证器向表单返回全局错误。然而,其中一些可以将错误关联到特定的字段。例如,throw_global_error
选项sfValidatorSchemaCompare
验证器可以选择全局错误(图2-10)或与第一个字段相关的错误(图2-11)。清单2-15显示了如何使用throw_global_error
选择。
清单2-15 -使用throw_global_error
选项
这个美元->validatorSchema->setPostValidator(新sfValidatorSchemaCompare(“start_date”, sfValidatorSchemaCompare::LESS_THAN_EQUAL,“end_date”,数组(“throw_global_error”= >真正的),数组(“无效”= >'开始日期("%left_field%")必须在结束日期("%right_field%")之前')));
图2-10 -全局验证器的全局错误
图2-11 -全局验证器的局部错误
最后,使用逻辑验证器允许您组合多个事后验证器,如清单2-16所示。
清单2-16 -将多个post -Validator与逻辑Validator结合
这个美元->validatorSchema->setPostValidator(新sfValidatorAnd(数组(新sfValidatorSchemaCompare(“start_date”, sfValidatorSchemaCompare::LESS_THAN_EQUAL,“end_date”),新sfValidatorSchemaCompare(“密码”, sfValidatorSchemaCompare::平等的,“password_again”),)));
文件上传
在PHP中处理文件上传,就像在所有面向web的语言中一样,涉及处理HTML代码和服务器端文件检索。在本节中,我们将看到表单框架为开发人员提供的工具,使他们的工作更轻松。我们还将了解如何避免落入常见陷阱。
让我们更改联系人表单,以允许将文件附加到消息。为此,我们将添加a文件
字段,如清单2-17所示。
清单2-17 -添加文件
字段到ContactForm
形式
/ / lib /形式/ ContactForm.class.php类ContactForm扩展标识{受保护的静态美元的科目=数组(“主题”,“B”主题,“C”主题);公共函数配置(){这个美元->setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“主题”= >新sfWidgetFormSelect(数组(“选择”= > self::美元的科目)),“消息”= >新sfWidgetFormTextarea(),“文件”= >新sfWidgetFormInputFile(),));这个美元->widgetSchema->setNameFormat(“接触(% s)”);这个美元->setValidators(数组(“名字”= >新sfValidatorString(数组(“要求”= >假)),“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorChoice(数组(“选择”= >中的(自我::美元的科目))),“消息”= >新sfValidatorString(数组(“min_length”= >4)),“文件”= >新sfValidatorFile(),));}}
当有一个sfWidgetFormInputFile
在窗体小部件中允许上传文件,还必须添加一个enctype
属性的形式
标签,如清单2-18所示。
清单2-18 -修改模板以获取文件
考虑到的领域
<表单动作=“< ?PHP echo url_for('联系人/索引')?>"方法=“职位”enctype =“多部分/格式”表> > <<?php回声美元的形式? >. / “2”> <输入类型=“提交”/>
请注意
如果动态生成与表单关联的模板,则isMultipart ()
方法的形式对象返回真正的
,如果它需要enctype
属性。
关于上传文件的信息不会与其他提交的值一起存储在PHP中。对象的调用随后需要修改bind ()
方法将此信息作为第二个参数传递,如清单2-19所示。
清单2-19 -将上传的文件传递到bind ()
方法
类contactActions扩展sfActions{公共函数executeIndex(美元的请求){这个美元->形式=新ContactForm();如果(美元的请求->isMethod(“职位”)){这个美元->形式->绑定(美元的请求->getParameter(“接触”),美元的请求->getfile(“接触”));如果(这个美元->形式->isValid()){美元的价值=这个美元->形式->getvalue();//对这些值执行一些操作/ /……}}}公共函数executeThankyou(){}}
现在表单已经完全可操作,我们仍然需要更改操作,以便将上传的文件存储到磁盘上。正如我们在本章开头所观察到的sfValidatorFile
将上传文件的相关信息转换为sfValidatedFile
对象。清单2-20显示了如何处理该对象以将文件存储在web /上传
目录中。
清单2-20 -使用sfValidatedFile
对象
如果(这个美元->形式->isValid()){美元的文件=这个美元->形式->getValue(“文件”);美元的文件名=“uploaded_”.sha1(美元的文件->getOriginalName());美元扩展=美元的文件->getExtension(美元的文件->getOriginalExtension());美元的文件->保存(sfConfig::得到(“sf_upload_dir”).' / '.美元的文件名.美元扩展);/ /……}
下表列出了所有sfValidatedFile
对象方法:
方法 | 描述 |
---|---|
save () | 保存上传的文件 |
isSaved () | 返回真正的 如果文件已经保存 |
getSavedName () | 返回已保存文件的名称 |
getExtension () | 根据mime类型返回文件的扩展名 |
getOriginalName () | 返回上传文件的名称 |
getOriginalExtension () | 返回上传文件名的扩展名 |
getTempName () | 返回临时文件的路径 |
方法() | 返回文件的mime类型 |
getSize () | 返回文件的大小 |
提示
浏览器在文件上传过程中提供的mime类型不可靠。为了保证最大限度的安全性,功能finfo_open
而且mime_content_type
,以及文件
工具在文件验证期间轮流使用。作为最后的手段,如果任何函数不能猜出mime类型,或者如果系统没有提供它们,则考虑浏览器的mime类型。要添加或更改猜测mime类型的函数,只需传递mime_type_guessers
选项。sfValidatorFile
构造函数。
本作品在创作共用署名相似共享3.0未移植许可许可下获得许可。