PHP File Upload is not working in jquery ajax form
本问题已经有最佳答案,请猛点这里访问。
我使用Ajax表单动态显示包含文件上载选项的表单。我正在获取每个文本值的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" /> <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)您提到您的会话代码是"最高级"。你在用像
或
2)查看其他会话进入时会话文件是否被锁定。在
但更可能是1。