php
  • jquery
  • ajax
  • yii
  • yii-components
  • 2014-01-11 64 views 4 likes 
    4

    我想使用ajax像facebook聊天一樣使用popover實現文件上傳。我發現使用ajax提交按鈕,它不能在Yii上傳文件。所以我嘗試使用像php方法。這裏是我找到的php方法,它工作良好。使用ajax上傳Yii中的文件

    <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; 
    } 
    ?> 
    

    我想知道的是,有Yii中的任何方法,從形式調用控制器動作?

    回答

    3

    其實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(); 
    
    +0

    由於FormData的用法,在IE8上不起作用。我對嗎? – MEM

    +0

    是的,在ie10中添加了formdata。如果你需要ie8支持 - 嘗試使用一些js插件或不使用ajax。 – ineersa

    相關問題