我在Yii中看到了一些奇怪的行为。
我有一个简单的文件上传,需要name
和文件本身。
如果我只是提交没有名称或文件的表单,我可以绕过验证(即 - 调用我的控制器操作并尝试处理上传的文件)我认为我的规则()是相应的设置来阻止它。这些是我的相关规则:
public function rules() {
return array(
array('name file', 'required', 'message' => 'This field is required'),
array('file', 'file', 'on' => 'insert', 'allowEmpty' => false, 'safe'=>true,
'maxSize'=> 512000,
'maxFiles'=> 1,
'mimeTypes' => 'application/msword, text/plain',
'tooLarge'=> 'file cannot be larger than 500KB.',
'wrongMimeType'=> 'Format must be: .doc .txt'
),
我指定该文件是必需的,并且文件数组中的allowEmpty也应该为false。那么我在这里做错了什么?
提前感谢您提供任何帮助
控制器
public function actionCreate() {
$model = new File;
if (isset($_POST['File'])) {
$model->setAttributes($_POST['File']);
// Set file
$model->file = CUploadedFile::getInstance($model,'file');
// Set directory
$dest = Yii::getPathOfAlias('application.uploads');
$model->tmp_name = time();
$model->date_added = new CDbExpression('NOW()');
$model->file_type = $model->file->type;
$model->file_size = $model->file->size;
$model->extension = $model->file->extensionName;
if ($model->save()) {
$model->file->saveAs(($dest . '/' . $model->tmp_name . '.' . $model->file->extensionName));
Yii::app()->user->setFlash('success','<strong>Success!</strong> Your file has been uploaded');
}
}
$this->render('create', array( 'model' => $model));
}
答案 0 :(得分:1)
对于您在,
和name
之间的第一条规则中遗漏file
的人。然后你说:
我可以绕过验证(即 - 我的控制器操作被称为......
由此我假设您使用AJAX验证并期望上传失败。但是,您无法使用CActiveForm
对文件上传进行AJAX验证。
因此,如果您修复上面的拼写错误,您至少会获得name
属性的AJAX验证。
您也可以删除'on'=>'insert'
方案。而且您不需要'safe'=>true
,因为您没有使用$model->file
属性进行大量分配。