Загрузка файла в Yii с помощью ajax

Я пытаюсь реализовать загрузку файлов из popover с помощью ajax, например, facebook chat. Я обнаружил, что, используя кнопку отправки ajax, он не может загружать файлы в Yii. Поэтому я попытался использовать метод php. Вот метод php, который я нашел, который хорошо работает.

<div id='preview'> </div> <form id="imageform" method="post" enctype="multipart/form-data" action='ajaximage.php'> Upload image: <div id='imageloadstatus' style='display:none'><img src="loader.gif" alt="Uploading...."/></div> <div id='imageloadbutton'> <input type="file" name="photoimg" id="photoimg" /> </div> </form> 

<

 script type="text/javascript" src="http://ajax.googleapis.com/ ajax/libs/jquery/1.8.1/jquery.min.js"></script> <script type="text/javascript" src="jquery.wallform.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#photoimg').live('change', function() { var A=$("#imageloadstatus"); var B=$("#imageloadbutton"); $("#imageform").ajaxForm({target: '#preview', beforeSubmit:function(){ A.show(); B.hide(); }, success:function(){ A.hide(); B.show(); }, error:function(){ A.hide(); B.show(); } }).submit(); }); }); </script> <?php include('db.php'); session_start(); $session_id='1'; // User session id $path = "uploads/"; function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } $valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP"); if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") { $name = $_FILES['photoimg']['name']; $size = $_FILES['photoimg']['size']; if(strlen($name)) { $ext = getExtension($name); if(in_array($ext,$valid_formats)) { if($size<(1024*1024)) // Image size max 1 MB { $actual_image_name = time().$session_id.".".$ext; $tmp = $_FILES['photoimg']['tmp_name']; if(move_uploaded_file($tmp, $path.$actual_image_name)) { mysql_query("UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'"); echo "<img src='uploads/".$actual_image_name."' class='preview'>"; } else echo "failed"; } else echo "Image file size max 1 MB"; } else echo "Invalid file format.."; } else echo "Please select image..!"; exit; } ?> в script type="text/javascript" src="http://ajax.googleapis.com/ ajax/libs/jquery/1.8.1/jquery.min.js"></script> <script type="text/javascript" src="jquery.wallform.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#photoimg').live('change', function() { var A=$("#imageloadstatus"); var B=$("#imageloadbutton"); $("#imageform").ajaxForm({target: '#preview', beforeSubmit:function(){ A.show(); B.hide(); }, success:function(){ A.hide(); B.show(); }, error:function(){ A.hide(); B.show(); } }).submit(); }); }); </script> <?php include('db.php'); session_start(); $session_id='1'; // User session id $path = "uploads/"; function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } $valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP"); if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") { $name = $_FILES['photoimg']['name']; $size = $_FILES['photoimg']['size']; if(strlen($name)) { $ext = getExtension($name); if(in_array($ext,$valid_formats)) { if($size<(1024*1024)) // Image size max 1 MB { $actual_image_name = time().$session_id.".".$ext; $tmp = $_FILES['photoimg']['tmp_name']; if(move_uploaded_file($tmp, $path.$actual_image_name)) { mysql_query("UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'"); echo "<img src='uploads/".$actual_image_name."' class='preview'>"; } else echo "failed"; } else echo "Image file size max 1 MB"; } else echo "Invalid file format.."; } else echo "Please select image..!"; exit; } ?> 

Я хотел бы знать, есть ли какой-либо метод в Yii, чтобы вызвать действие контроллера из формы?

На самом деле Yii имеет класс загрузки файлов. Для проверки вы можете использовать правила модели:

 array('url_img', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'wrongType'=>Yii::t('app','bad_file')), 

Вы можете загружать файлы с помощью ajax, например:

 var fd = new FormData(); fd.append( "ModelName[image]", $("#your_input_id")[0].files[0]); $.ajax({ url: url, type: 'POST', cache: false, data: fd, dataType: "json", processData: false, contentType: false, success: function (data) { } }); 

Чтобы сохранить файл, выполните следующие действия:

 $model=new ModelName; CUploadedFile::getInstance($model,"image"); if ($model->validate()){ $model->image->saveAs("path/to/save/image.png"); } 

Также смотрите http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/

По вашему мнению, у вас будет что-то вроде этого:

 $form = $this->beginWidget( 'CActiveForm', array( 'id' => 'upload-form', 'enableAjaxValidation' => false, 'htmlOptions' => array('enctype' => 'multipart/form-data'), ) ); // ... echo $form->labelEx($model, 'image'); echo $form->fileField($model, 'image'); echo $form->error($model, 'image'); // ... echo CHtml::submitButton('Submit'); $this->endWidget();