关于javascript:PHP文件上传无法在jquery ajax表单中使用

PHP File Upload is not working in jquery ajax form

本问题已经有最佳答案,请猛点这里访问。

我使用Ajax表单动态显示包含文件上载选项的表单。我正在获取每个文本值的post值,但文件数组为空。我已经执行了print_r($_POST)print_r($_FILES)来查看post数据,$文件数组显示空值。

这是我用的表格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<form class="form-3 form-horizontal ajxfrm" id="step-three" enctype="multipart/form-data" action="<?php echo $html->addLink(array('controller'=>'homes','action'=>'step_three_ajax')); ?>" method="post">

   
   
       
            <label class="control-label">Name</label>
            <input id="name" type="text" name="name" />
       
   
   
       
            Email
            <input id="email" type="text" name="email" />
       
   
   
       
            Contact
            <input id="contact" type="text" name="contact" />
       
   
   
       
            Files<br/><span style="font-size:10px; font-style:italic">(Optional)</span>
           
                <input id="fileupload" type="file" name="fileupload" /><br/>
           
       
   
   
       
            Your Message
            <textarea id="message" rows="3" name="message"></textarea>
       
   
   

       
    <input type="hidden" name="post" value="1"/>
    <input type="submit" class="btn green" value="Next"/>

</form>

这是Ajax调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$('.ajxfrm').live('submit',function(){
    var thisObj = this;
    var submit = true;
    if('step-two'==$(thisObj).attr('id')){
        submit = stepTwo();
    }else if('step-three'==$(thisObj).attr('id')){
        submit = stepThree();
    }          
    if(submit){
        $.ajax({
            type:"POST",
            data: $(thisObj).serialize(),
            url: $(thisObj).attr('action'),
            beforeSend: function(){
                showOverLayer();
            },
            success: function(data){
                $(thisObj).parent("#content").empty().html(data).hide().fadeIn(function(){
                    setBlocks();
                    setLiClick();
                    hideOverLayer();
                });
                changeCalNaviHref();
            }
        });
    }
    return false;
});

这里我使用控制器中的$booker->uploadFiles();调用upload函数这是控制器方法函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function step_three(){
    //save booking
    if(isset($_POST['post'])){
        $booker = new Booker();    
        //create booker
        $_SESSION['userdat']['name']=$_POST['name'];
        $_SESSION['userdat']['email']=$_POST['email'];
        $_SESSION['userdat']['contact']=$_POST['contact'];
        $_SESSION['userdat']['message']=$_POST['message'];

        if($booker->setsessions($_SESSION['userdat']))
        {
            $booker->uploadfiles();
            $this->redirect(array('controller'=>'homes','action'=>'step_four'));
        }
        else
        {
            $this->setFlashMsg('Please Provide Valid Information','message-box ok');
        }
    }
}

下面是模型函数uploadfiles()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public function uploadfiles()
    {
    if(isset($_FILES['fileupload']))
    {
        $errors= array();
        foreach($_FILES['fileupload']['tmp_name'] as $key => $tmp_name )
        {
            print_r($_FILES);
            exit;
            $file_name = $key.$_FILES['fileupload']['name'][$key];
            $file_size =$_FILES['fileupload']['size'][$key];
            $file_tmp =$_FILES['fileupload']['tmp_name'][$key];
            $file_type=$_FILES['fileupload']['type'][$key];
            if($file_size > 2097152)
            {
                $errors[]='File size must be less than 2 MB';
            }  
            $upload_dir = ROOT;
            $desired_dir="/uploads/";
            if(empty($errors)==true)
            {
                if(is_dir($desired_dir)==false)
                {
                    mkdir("$desired_dir", 0700); // Create directory if it does not exist
                }
            if(is_dir("$desired_dir/".$file_name)==false)
            {
                //$file_path=$upload_dir."$desired_dir/".$file_name;
                move_uploaded_file($file_tmp,$upload_dir."$desired_dir/".$file_name);
            }
            else
            {                                           // rename the file if another one exist
                $file_path=$upload_dir."$desired_dir/".$file_name.time();
                rename($file_tmp,$file_path) ;              
            }          
        }
        else
        {
            print_r($errors);
        }
    }
    if(empty($error))
    {
            //echo"Success"; exit;
            return true;
    }
    return false;
}

我这里缺什么?


试试这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$('.ajxfrm').live('submit',function(){
        var thisObj = $(this),
            submit = true;

        if('step-two'== thisObj.attr('id')){
            submit = stepTwo();
        }else if('step-three'== thisObj.attr('id')){
            submit = stepThree();
        }
        if(submit){
            $.ajax({
              type:"POST",
              data: thisObj.serialize(),
              url: thisObj.attr('action'),
              beforeSend: function(){
                 showOverLayer();
              },
              success: function(data){
                 thisObj.parent("#content").empty().html(data).hide().fadeIn(function(){
                     setBlocks();
                     setLiClick();
                     hideOverLayer();
                 });
                 changeCalNaviHref();
              }
            });
        }
    return false;
});

你能给我看一个关于成功方法的console.log(data)吗?

谢谢


不能使用"旧"Ajax发送文件(不是这样)。

如果要发送文件,请查看xmlhttprequest2。这里有非常好的教程-http://www.html5rocks.com/en/tutorials/file/xhr2/


这里有两个长镜头:

1)您提到您的会话代码是"最高级"。你在用像session_regenerate_id这样的东西吗?这将干扰并行上传。

2)查看其他会话进入时会话文件是否被锁定。在session_write_close()上搜索一两篇文章。

但更可能是1。