2013-11-20 87 views
1

我想使用ajax上传文件,但我没有在php $_FILES中获取数据,我在$_REQUEST中获取它。我该怎么做。下面是我的jQuery代码.Ajax不能用于文件上传,所以是否有任何代码,以便我可以合并现有的代码来上传文件。Php ajax文件上传错误

<script> 
jQuery(function($){ 
    jQuery('#btn').click(function(){ 

     var data = {}, 
      ticks = []; 

     $('.ajax_elements').each(function(_, elem) { 
      data[this.id] = this.value; 

     }); 


     $.ajax({ 
      type : 'POST', 
      url : 'app_process.php', 
      data : data, 
      cache : false 
     }).done(function(result) { 
      alert(result); 
     }); 
    }); 
}); 
</script> 
<form name="frm" enctype="multipart/form-data"> 
    <input type="text" name="bb" class="ajax_elements" id="one"/> 
    <input type="file" class="ajax_elements" name="passport" id="passport" /> 
    <input type="button" name="bttn" id="btn" /> 
    </form> 

这里是php文件代码

<?php 
    if($_REQUEST['passport']!=''): 
     $uploaddir = 'images/'; 
     move_uploaded_file($_FILES["file"]["tmp_name"], $uploaddir . str_replace(" ","_",$_REQUEST['passport'])); 
    endif; 
?> 

错误消息

通知:未定义指数:文件中 G:\ XAMPP \ htdocs中\ data_ajax \ app_process.php on line

+0

发布错误..无论您得到的是什么 –

+0

您不能使用AJAX上传文件,除非您使用HTML5文件API并发送原始数据或使用隐藏的iframe。 –

+0

是的,你可以。请参阅我的答案与jquery,但也可能没有(请参阅链接@ vijay4vijju的答案) – Asenar

回答

0

有2个问题:

您需要添加属性enctype="multipart/form-data"在表单标签,如果你要上传文件:

更换

<form name="frm"> 

通过

<form name="frm" enctype="multipart/form-data" > 

使用ajax(和jquery),你不能直接发送文件。但我建议你jquery form plugin谁可以帮助你

+0

我想知道为什么负面投票^^ – Asenar

+0

这个回答没有什么是错的 – zzlalani

+0

为什么要为这个投票 –

2

我的建议是看看XMLHttpRequest,FormDataFile API。 Mozilla Developer Network在所有这些方面都有很好的文档。

这需要测试和调整要在你的开发环境更健壮,但沿着这个线的东西可以让你开始...

<script> 
$('#btn').click(function() { 

    var xhr = new XMLHttpRequest(); 

    xhr.upload.addEventListener("load", function(e){ 
     // stuff to do when upload is complete 
    }, false); 

    xhr.upload.addEventListener("progress", function(e){ 
     // stuff here to handle progress bars, progress percentages etc. 
    }, false); 

    xhr.open('POST', 'app_process.php', true); 

    var formdata = new FormData(); 
    var file = $('#passport').get(0).files[0]; 

    formdata.append('passport', file); 

    xhr.send(formdata); 

}); 
</script> 

而PHP ...

<?php 
if (isset($_FILES['passport'])) { 
    $uploaddir = 'images/'; 
    $upload = move_uploaded_file($_FILES['passport']['tmp_name'], $uploaddir . str_replace(" ","_",$_FILES['passport']['name'])) or exit('Upload failed.'); 
} else { 
    exit('File not found'); 
} 
?> 

需要将与该文件一起发送的任何其他信息添加到FormData对象中。这些将显示在PHP $_POST变量中。

formdata.append('field', 'data'); 

记住,这些API是没有普遍的浏览器支持,所以最好的做法是用户到达该点之前,包括所有常用的功能检测脚本。

你也可以上传功能结合到文件输入,而不是要求一个按钮,点击更改事件......

$('#passport').change(function() { ... 

希望有所帮助。

+0

这是这整个线程中唯一正确/很好的答案。 –