Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用ajax将文件发送到服务器_Php_Ajax_Yii - Fatal编程技术网

Php 使用ajax将文件发送到服务器

Php 使用ajax将文件发送到服务器,php,ajax,yii,Php,Ajax,Yii,以下是我的看法: <?php $modelupload=new Upload; ?> <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'upload-upload', 'enableAjaxValidation'=>false, 'htmlOptions'=>array( 'onsubmit'=>"return false;",

以下是我的看法:

<?php $modelupload=new Upload; ?>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'upload-upload',
    'enableAjaxValidation'=>false,
    'htmlOptions'=>array(
        'onsubmit'=>"return false;",
        'enctype' => 'multipart/form-data',
    ),
)); ?>

<div class="row">
    <?php echo $form->labelEx($modelupload,'New name'); ?>
    <?php echo $form->textField($modelupload,'Name'); ?>
</div>


<div class="row">
    <?php echo $form->labelEx($modelupload,'File'); ?>
    <?php echo $form->fileField($modelupload,'Extra'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($modelupload,'Description'); ?>
    <?php echo $form->textArea($modelupload,'Description'); ?>
</div>

<?php echo CHtml::Button('Upload',array('onclick'=>'upload();')); ?>


<?php $this->endWidget(); ?>

<script type="text/javascript">

function upload(){
    var data=new FormData($("#upload-upload")[0]);
    var extra={data1:"some text i want to attach",data2:"more text"};
    data={data:data,extra:extra};
    $.ajax({
        type:"POST",
        url:'<?php echo Yii::app()->createAbsoluteUrl("site/upload"); ?>',
        data:{"command":data},
        dataType:"json",
        processData: false,
        contentType: false,
        success:function successFunc(arr){
             alert(arr['text']);
        },
        error:function errorFunc(){
             alert("Something went wrong.");
        }
    })
}

</script>
当我在服务器上检查$\u POST['command']时,它说它没有设置,整个数组$\u POST是空的。。。无需上传文件即可正常工作,但有了文件和多部分/表单数据,我无法使其正常工作


如何上传文件+从其他表单字段附加信息+附加我自己的信息?我尝试了一些方法,也阅读了其他人的问题,但我无法得到我想要的结果。

我编写了自己的XMLHttpRequest,而不是使用ajax,它成功了!我可以使用

$arr=explode(',',$_POST['command']);
和我的档案

$file=CUploadedFile::getInstanceByName('File');
。。。我想这比使用ajax更好,但我仍然想知道如何使它与ajax一起工作

function upload(){        
    var data=new FormData();
    var input=document.getElementById('Upload_Extra');
    var command=[$("#Upload_Name").val(),$("#Upload_Description").val(),"Some text I want to attach","more text"];
    data.append("command",command);
    data.append('File',input.files[0]);
    var xhr=new XMLHttpRequest();
    xhr.open('POST','<?php echo Yii::app()->createAbsoluteUrl("admin/upload");?>',true);
    xhr.onload=function(){
        if (this.status==200){
            var resp=JSON.parse(this.response);
            alert(resp.text);
        };
    };
    xhr.onerror=function(){
        alert("Something went wrong.");
    }
    xhr.send(data);
}
也许你可以用这个来解决问题

也许做一个ajax调用可以帮助你更好地解决你的问题

在服务器端。。。检索数据

if(isset($_POST['ModelName']))  or print_r($_POST);

并使用控制台。。。。或者简单的REST客户端调试…

如果额外的var数据不依赖。。。你可以用两个隐藏的文件来做。。。也不要使用onclick函数。。。通过将clientValidation设置为true使用afterValidate,在clientOptions中使用afterValidate函数,其中使用相同的技术调用上载函数。。。并返回false以避免重定向以同步表单提交。。。并在控制台chrome中检查正在传递的数据。。
<input type="hidden" name="ModelName[hiddenFiels1]" id="ModelName_hiddenFiels1" value="desired data" />
<input type="hidden" name="ModelName[hiddenFiels2]" id="ModelName_hiddenFiels2" value="desired data"  />
function upload(){
var data = new FormData(form[0]);
 $.ajax({

    "type":"POST",
    "url":form.attr('action'),
    "data": data,
    "async": false,
    "success":function(data){

           alert('success');

    },
    "cache": false,
    "contentType": false,
    "processData": false,
 });

}
if(isset($_POST['ModelName']))  or print_r($_POST);