使用Ajax调用上传Yii文件?

时间:2012-01-17 02:31:27

标签: ajax file-upload yii reload

您好我正在使用Yii进行文件上传。我已经实现了这种方式,它非常好用:

查看:

echo CHtml::form($this->createUrl('uploadreport'), 'post', array('enctype'=>'multipart/form-data'));
<div id="div_upload" class="row" style="display:none">
    <?php
    $this->widget('CMultiFileUpload',array(
        'name'        => 'files',
        'accept'      => 'doc|docx',
        'max'         => 1,
        'htmlOptions' => array('size' => 25),
    ));

    echo CHtml::submitButton('Upload');
    ?>
</div>

控制器:

if (isset($_FILES['files'])) {
    $tmp_name = $_FILES['files']['tmp_name'][0];
    $filename = $_FILES['files']['name'][0];
    $new_url = '/home/ivan/reports/'.$filename;

    // Upload file
    move_uploaded_file($tmp_name, $new_url);

    $calc_id = $_POST['calc_id'];

    // Check if there is a previous report
    $report = Report::model()->findByAttributes(array('calc_id'=>$calc_id));
    if (isset($report)) {
        // If there is a previous report, delete it
        $qtxt = "DELETE FROM `tbl_reports` WHERE `calc_id` LIKE '$calc_id';";
        $exec = Yii::app()->db->createCommand($qtxt)->execute();
    }

    // Insert the new report
    $rep_add = new Report;
    $rep_add->calc_id = $calc_id;
    $rep_add->report_url = $new_url;
    $rep_add->save();
}

正如您在我看来所看到的,我正在使用CHtml::submitButton。但我想改用它:

echo CHtml::button(
    'Upload Report', array(
        'ajax'    => array(
            'type' => 'POST',
            'url'  => CController::createUrl('Calculator/uploadReport'),
        )
    )
);

但是如果我使用上面的内容,那么在我的控制器$_FILES['files']中会显示为空,或者如果我尝试CUploadedFile::getInstance();它会返回一个空字符串。

我想使用ajax,因为我不想渲染任何其他视图,我希望用户在上传文件后保留在当前视图中。如何使用Ajax或如何在使用CHtml::submitButton('Upload');

时停止刷新当前视图

任何提示/帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

我最终使用EAjaxUpload扩展名。我认为在Yii中无法通过Ajax处理文件上传。

答案 1 :(得分:0)

使用CHtml :: ajaxSubmitButton()代替。这是执行ajax提交的正确方法。请查看此处的文档:http://www.yiiframework.com/doc/api/1.1/CHtml/#ajaxSubmitButton-detail而不是

答案 2 :(得分:0)

我无法通过ajax操作调用我的控制器操作。所以,我认为Yii是不可能的。我最终使用了这个扩展名:http://www.yiiframework.com/extension/eajaxupload/,它使用Ajax执行文件上传。

答案 3 :(得分:0)

你为什么不用这个: http://www.yiiframework.com/extension/coco/ 它非常强大,希望它可以帮助你