Yii: Загрузка видео не удалась при загрузке

Я yiibie. Что я собираюсь делать, чтобы загружать видео, для этого я использую расширение Uploadmiltifiles и следую этой ссылке http://www.yiiframework.com/extension/uploadmultifiles . Я следил за каждым, но когда я загружаю видеофайл (файл .3gp), я "testingvideo.3gp" не удалось, и после отправки он говорит: "Video file cannot be blank" Это код моего видеоконтроллера, который имеет actionupload() function .

 <?php class VideoController extends RController { /** * @var string the default layout for the views. Defaults to '//layouts/column2', meaning * using two-column layout. See 'protected/views/layouts/column2.php'. */ public $layout='//layouts/admin'; /** * @return array action filters */ public function filters() { return array( // 'accessControl', // perform access control for CRUD operations // 'postOnly + delete', // we only allow deletion via POST request 'rights', ); } /** * Specifies the access control rules. * This method is used by the 'accessControl' filter. * @return array access control rules */ public function accessRules() { return array( array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array('index','view'), 'users'=>array('*'), ), array('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'=>array('create','update'), 'users'=>array('@'), ), array('allow', // allow admin user to perform 'admin' and 'delete' actions 'actions'=>array('admin','delete'), 'users'=>array('admin'), ), array('deny', // deny all users 'users'=>array('*'), ), ); } /** * Displays a particular model. * @param integer $id the ID of the model to be displayed */ public function actionView($id) { $this->render('view',array( 'model'=>$this->loadModel($id), )); } /** * Creates a new model. * If creation is successful, the browser will be redirected to the 'view' page. */ public function actionCreate() { $model=new Video; // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['Video'])) { $model->attributes=$_POST['Video']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('create',array( 'model'=>$model, )); } /** * Updates a particular model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id the ID of the model to be updated */ public function actionUpdate($id) { $model=$this->loadModel($id); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['Video'])) { $model->attributes=$_POST['Video']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('update',array( 'model'=>$model, )); } public function actionUpload() { Yii::import("ext.EAjaxUpload.qqFileUploader"); $folder=Yii::getPathOfAlias('webroot').'/upload/';// folder for uploaded files $allowedExtensions = array("jpg","jpeg","gif","exe","mov","mp4",);//array("jpg","jpeg","gif","exe","mov" and etc... $sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); $result = $uploader->handleUpload($folder); $return = htmlspecialchars(json_encode($result), ENT_NOQUOTES); $fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE $fileName=$result['filename'];//GETTING FILE NAME //$img = CUploadedFile::getInstance($model,'image'); echo $return;// it's array } /** * Deletes a particular model. * If deletion is successful, the browser will be redirected to the 'admin' page. * @param integer $id the ID of the model to be deleted */ public function actionDelete($id) { if(Yii::app()->request->isPostRequest) { // we only allow deletion via POST request $this->loadModel($id)->delete(); // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser if(!isset($_GET['ajax'])) $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin')); } else throw new CHttpException(400,'Invalid request. Please do not repeat this request again.'); } /** * Lists all models. */ public function actionIndex() { $dataProvider=new CActiveDataProvider('Video'); $this->render('index',array( 'dataProvider'=>$dataProvider, )); } /** * Manages all models. */ public function actionAdmin() { $model=new Video('search'); $model->unsetAttributes(); // clear any default values if(isset($_GET['Video'])) $model->attributes=$_GET['Video']; $this->render('admin',array( 'model'=>$model, )); } /** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. * @param integer $id the ID of the model to be loaded * @return Video the loaded model * @throws CHttpException */ public function loadModel($id) { $model=Video::model()->findByPk($id); if($model===null) throw new CHttpException(404,'The requested page does not exist.'); return $model; } /** * Performs the AJAX validation. * @param Video $model the model to be validated */ protected function performAjaxValidation($model) { if(isset($_POST['ajax']) && $_POST['ajax']==='video-form') { echo CActiveForm::validate($model); Yii::app()->end(); } } } 

Это код моего файла просмотра видео (_form.php)

 <?php /* @var $this VideoController */ /* @var $model Video */ /* @var $form BSActiveForm */ ?> <?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array( 'id'=>'video-form', // Please note: When you enable ajax validation, make sure the corresponding // controller action is handling ajax validation correctly. // There is a call to performAjaxValidation() commented in generated controller code. // See class documentation of CActiveForm for details on this. 'enableAjaxValidation'=>false, )); ?> <p class="help-block">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <?php //echo $form->errorSummary($model); ?> <?php echo $form->labelEx($model,'user_id'); ?> <?php $this->widget('ext.select2.ESelect2',array( 'name'=>'Video[user_id]', 'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list 'htmlOptions'=>array( 'placeholder'=>' search User name?', //'options'=>$options, //the selected values //'multiple'=>'multiple', 'style'=>'width:530px', ), )); ?> <br><br> <?php $this->widget('ext.EAjaxUpload.EAjaxUpload', array( 'id'=>'uploadFile', 'config'=>array( 'action'=>Yii::app()->createUrl('site/upload'), 'allowedExtensions'=>array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png"),//array("jpg","jpeg","gif","exe","mov" and etc... 'sizeLimit'=>1000*1024*1024,// maximum file size in bytes 'minSizeLimit'=>1*1024, 'auto'=>true, 'multiple' => true, 'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }", 'messages'=>array( 'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.", 'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.", 'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.", 'emptyError'=>"{file} is empty, please select files again without it.", 'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled." ), 'showMessage'=>"js:function(message){ alert(message); }" ) )); ?> <?php echo $form->errorSummary($model); ?> <?php //echo $form->textFieldControlGroup($model,'filename',array('maxlength'=>45)); ?> <?php //echo $form->textFieldControlGroup($model,'user_id'); ?> <?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?> <?php $this->endWidget(); ?> 

И это код моего config/main.php

 <?php // uncomment the following to define a path alias // Yii::setPathOfAlias('local','path/to/local-folder'); // This is the main Web application configuration. Any writable // CWebApplication properties can be configured here. return array( 'theme' => 'bootstrap', 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'emergency response system', // preloading 'log' component 'preload'=>array('log'), 'aliases' => array( 'bootstrap' => 'ext.bootstrap'), // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'bootstrap.behaviors.*', 'bootstrap.helpers.*', 'bootstrap.widgets.*', 'application.modules.user.models.*', 'application.modules.user.components.*', 'application.modules.rights.*', 'application.modules.rights.components.*', 'application.extensions.EAjaxUpload.*',//this is for uploading of video ), 'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'ers', 'generatorPaths' => array( 'bootstrap.gii', ), // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), 'user' => array( 'tableUsers' => 'user', 'tableProfiles' => 'profiles', 'tableProfileFields' => 'profiles_fields', // # encrypting method (php hash function) // 'hash' => 'md5', // // # send activation email // 'sendActivationMail' => true, // // # allow access for non-activated users // 'loginNotActiv' => false, // // # activate user on registration (only sendActivationMail = false) // 'activeAfterRegister' => false, // // # automatically login from registration // 'autoLogin' => true, // // # registration path // 'registrationUrl' => array('/user/registration'), // // # recovery password path // 'recoveryUrl' => array('/user/recovery'), // // # login form path // 'loginUrl' => array('/user/login'), // // # page after login // 'returnUrl' => array('/user/profile'), // // # page after logout // 'returnLogoutUrl' => array('/user/login'), ), 'rights'=>array( 'install'=>true, // 'superuserName'=>'Admin', // Name of the role with super user privileges. // 'authenticatedName'=>'Authenticated', // Name of the authenticated user role. // 'userIdColumn'=>'id', // Name of the user id column in the database. // 'userNameColumn'=>'username', // Name of the user name column in the database. // 'enableBizRule'=>true, // Whether to enable authorization item business rules. // 'enableBizRuleData'=>true, // Whether to enable data for business rules. // 'displayDescription'=>true, // Whether to use item description instead of name. // 'flashSuccessKey'=>'RightsSuccess', // Key to use for setting success flash messages. // 'flashErrorKey'=>'RightsError', // Key to use for setting error flash messages. // 'baseUrl'=>'/rights', // Base URL for Rights. Change if module is nested. // 'layout'=>'rights.views.layouts.main', // Layout to use for displaying Rights. // 'appLayout'=>'application.views.layouts.main', // Application layout. // 'cssFile'=>'rights.css', // Style sheet file to use for Rights. // 'install'=>false, // Whether to enable installer. // 'debug'=>false, ), ), // application components 'components'=>array( 'user'=>array( 'class'=>'RWebUser', // enable cookie-based authentication 'allowAutoLogin'=>true, 'loginUrl'=>array('/user/login'), ), 'authManager'=>array( 'class'=>'RDbAuthManager', 'connectionID'=>'db', 'defaultRoles'=>array('Authenticated', 'Guest'), // 'itemTable'=>'authitem', // 'itemChildTable'=>'authitemchild', // 'assignmentTable'=>'authassignment', // 'rightsTable'=>'rights', ), 'bootstrap' => array( 'class' => 'bootstrap.components.BsApi',), // uncomment the following to enable URLs in path-format 'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( //'<controller:\w+>'=>'<controller>/list', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', '<controller:\w+>/<id:\d+>/<title>'=>'<controller>/view', '<controller:\w+>/<id:\d+>'=>'<controller>/view', ), ), // database settings are configured in database.php // 'db'=>require(dirname(__FILE__).'/database.php'), 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=response_system', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), 'errorHandler'=>array( // use 'site/error' action to display errors 'errorAction'=>'site/error', ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), // uncomment the following to show log messages on web pages array( 'class'=>'CWebLogRoute', ), ), ), ), // application-level parameters that can be accessed // using Yii::app()->params['paramName'] 'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', ), ); 

И это модель видео

 <?php /** * This is the model class for table "video". * * The followings are the available columns in table 'video': * @property integer $id * @property string $filename * @property integer $user_id * * The followings are the available model relations: * @property User $user */ class Video extends CActiveRecord { /** * Returns the static model of the specified AR class. * @param string $className active record class name. * @return Video the static model class */ public static function model($className=__CLASS__) { return parent::model($className); } /** * @return string the associated database table name */ public function tableName() { return 'video'; } /** * @return array validation rules for model attributes. */ public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('filename, user_id', 'required'), array('user_id', 'numerical', 'integerOnly'=>true), array('filename', 'length', 'max'=>45), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, filename, user_id', 'safe', 'on'=>'search'), ); } /** * @return array relational rules. */ public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( 'user' => array(self::BELONGS_TO, 'User', 'user_id'), ); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'id' => 'ID', 'filename' => 'Filename', 'user_id' => 'User', ); } /** * Retrieves a list of models based on the current search/filter conditions. * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions. */ public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->compare('id',$this->id); $criteria->compare('filename',$this->filename,true); $criteria->compare('user_id',$this->user_id); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } } Please help me with this, thank you. 

Related of "Yii: Загрузка видео не удалась при загрузке"

Кажется, что ваша html-форма не имеет атрибута enctype поэтому $_FILES пуст. Попробуйте добавить:

 <?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array( 'id'=>'video-form', 'enableAjaxValidation'=>false, 'htmlOptions'=>array('enctype'=>'multipart/form-data'), )); ?> 

файл представления должен быть таким.

 <?php /* @var $this VideoController */ /* @var $model Video */ /* @var $form BSActiveForm */ ?> <?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array( 'id'=>'video-form', // Please note: When you enable ajax validation, make sure the corresponding // controller action is handling ajax validation correctly. // There is a call to performAjaxValidation() commented in generated controller code. // See class documentation of CActiveForm for details on this. 'enableAjaxValidation'=>false, )); ?> <p class="help-block">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <?php //echo $form->errorSummary($model); ?> <?php echo $form->labelEx($model,'user_id'); ?> <?php $this->widget('ext.select2.ESelect2',array( 'name'=>'Video[user_id]', 'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list 'htmlOptions'=>array( 'placeholder'=>' search User name?', //'options'=>$options, //the selected values //'multiple'=>'multiple', 'style'=>'width:530px', ), )); ?> <br><br> <?php $this->widget('ext.EAjaxUpload.EAjaxUpload', array( 'id'=>'uploadFile', 'config'=>array( 'action'=>Yii::app()->createUrl('video/upload'),//add your controller name here 'allowedExtensions'=>array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png"),//array("jpg","jpeg","gif","exe","mov" and etc... 'sizeLimit'=>1000*1024*1024,// maximum file size in bytes 'minSizeLimit'=>1*1024, 'auto'=>true, 'multiple' => true, 'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }", 'messages'=>array( 'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.", 'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.", 'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.", 'emptyError'=>"{file} is empty, please select files again without it.", 'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled." ), 'showMessage'=>"js:function(message){ alert(message); }" ) )); ?> <?php echo $form->errorSummary($model); ?> <?php //echo $form->textFieldControlGroup($model,'filename',array('maxlength'=>45)); ?> <?php //echo $form->textFieldControlGroup($model,'user_id'); ?> <?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?> <?php $this->endWidget(); ?> 

и контроллер должен быть таким,

 <?php class VideoController extends RController { /** * @var string the default layout for the views. Defaults to '//layouts/column2', meaning * using two-column layout. See 'protected/views/layouts/column2.php'. */ public $layout='//layouts/admin'; /** * @return array action filters */ public function filters() { return array( // 'accessControl', // perform access control for CRUD operations // 'postOnly + delete', // we only allow deletion via POST request 'rights', ); } /** * Specifies the access control rules. * This method is used by the 'accessControl' filter. * @return array access control rules */ public function accessRules() { return array( array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array('index','view'), 'users'=>array('*'), ), array('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'=>array('create','update'), 'users'=>array('@'), ), array('allow', // allow admin user to perform 'admin' and 'delete' actions 'actions'=>array('admin','delete'), 'users'=>array('admin'), ), array('deny', // deny all users 'users'=>array('*'), ), ); } /** * Displays a particular model. * @param integer $id the ID of the model to be displayed */ public function actionView($id) { $this->render('view',array( 'model'=>$this->loadModel($id), )); } /** * Creates a new model. * If creation is successful, the browser will be redirected to the 'view' page. */ public function actionCreate() { $model=new Video; // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['Video'])) { $model->attributes=$_POST['Video']; Yii::import("ext.EAjaxUpload.qqFileUploader"); $folder=Yii::getPathOfAlias('webroot').'/..video/';// folder for uploaded files $allowedExtensions = array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png");//array("jpg","jpeg","gif","exe","mov" and etc... $sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); $result = $uploader->handleUpload($folder); $return = htmlspecialchars(json_encode($result), ENT_NOQUOTES); $fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE $fileName=$result['filename'];//GETTING FILE NAME //$img = CUploadedFile::getInstance($model,'image'); echo $return;// it's array if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('create',array( 'model'=>$model, )); } /** * Updates a particular model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id the ID of the model to be updated */ public function actionUpdate($id) { $model=$this->loadModel($id); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['Video'])) { $model->attributes=$_POST['Video']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('update',array( 'model'=>$model, )); } /** * Deletes a particular model. * If deletion is successful, the browser will be redirected to the 'admin' page. * @param integer $id the ID of the model to be deleted */ public function actionDelete($id) { if(Yii::app()->request->isPostRequest) { // we only allow deletion via POST request $this->loadModel($id)->delete(); // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser if(!isset($_GET['ajax'])) $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin')); } else throw new CHttpException(400,'Invalid request. Please do not repeat this request again.'); } /** * Lists all models. */ public function actionIndex() { $dataProvider=new CActiveDataProvider('Video'); $this->render('index',array( 'dataProvider'=>$dataProvider, )); } /** * Manages all models. */ public function actionAdmin() { $model=new Video('search'); $model->unsetAttributes(); // clear any default values if(isset($_GET['Video'])) $model->attributes=$_GET['Video']; $this->render('admin',array( 'model'=>$model, )); } public function actionUpload() { Yii::import("ext.EAjaxUpload.qqFileUploader"); $folder=Yii::getPathOfAlias('webroot').'/video/';// folder for uploaded files $allowedExtensions = array();//array("jpg","jpeg","gif","exe","mov" and etc... $sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); $result = $uploader->handleUpload($folder); $return = htmlspecialchars(json_encode($result), ENT_NOQUOTES); $fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE $fileName=$result['filename'];//GETTING FILE NAME //$img = CUploadedFile::getInstance($model,'image'); echo $return;// it's array } /** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. * @param integer $id the ID of the model to be loaded * @return Video the loaded model * @throws CHttpException */ public function loadModel($id) { $model=Video::model()->findByPk($id); if($model===null) throw new CHttpException(404,'The requested page does not exist.'); return $model; } /** * Performs the AJAX validation. * @param Video $model the model to be validated */ protected function performAjaxValidation($model) { if(isset($_POST['ajax']) && $_POST['ajax']==='video-form') { echo CActiveForm::validate($model); Yii::app()->end(); } } }