核心提示:作为一个开发人员,踩坑是必要的,不踩坑是不长进的。今天我们就来谈谈ajax上传文件时可能遇到的几个大坑。html 文件:/pinput type=file id=fileloadername=file...
作为一个开发人员,踩坑是必要的,不踩坑是不长进的。今天我们就来谈谈ajax上传文件时可能遇到的几个大坑。
html 文件:
</p> <input type="file" id="fileloader" name="file" /> <button id="fileuploader">开始上传</button> </p>
需要添加的js文件jquery-2.1.4.min.js,
自定义的ajax代码片段,
$(function(){
$('#fileuploader').click(function () {
//获取上传文件的相关信息,得到的数据是数组格式
var fileArray = document.getElementById('fileloader').files;
var formData = new FormData();
for(var i=0; i上面的代码是ajax向服务器传递文件的方法,其中需要特别注意:
1.async:false,
false为同步,这个Ajax请求将整个浏览器锁死,只有upLoad_File方法执行结束后,才可以执行其它操作。
2.async: true,
true是异步的,这个ajax请求和其后面的操作是异步执行的,那么当upLoad_File方法还未执行完,就可能已经执行了 ajax请求后面的操作,如:alert(responseStr.info);然而,info这个数据是在ajax请求success后才赋值的,结果,输出时会为空。
当然还有另一种方式来达到和同步的同种效果,那就是在函数体末尾加 return false;来防止函数的继续调用。
服务器接收文件
我用的是php语言和thinkphp框架,编写的接收方法如下
public function upLoad_File(){
//文件保存路径
$output_dir = APP_PATH."/../upload/";
//获取上传文件名
$fileName=$_FILES['fileArray']['name'];
//获取上传文件
$file=$_FILES['fileArray'];
if (!isset($file)){
$this->ajaxReturn(array(
'msg'=>0,
"info"=>"文件上传失败!",
));
}else{
//上传文件
if(!@move_uploaded_file($file['tmp_name'],$output_dir.$fileName)){
$this->ajaxReturn(array(
'msg'=>0,
"info"=>"文件上传失败!",
));
} ;
$this->ajaxReturn(array(
'msg'=>1,
"info"=>"文件上传成功!!",
));
// return $fileName;
}
}
服务端接收文件需要注意的地方是$_FILES[‘fileArray’],它就是ajax传过来的formData.append(“fileArray”, fileArray[i])数据。


