ajax上传文件需要使用formData对象
var formData = new FormData($( "form" )[0]);
$.ajax({
url: '__CONTROLLER__/upload' ,
type: 'POST',
data: formData,
dataType:'json',
async: false,
cache: false,
contentType: false,
processData: false,
success: function (response) {
if(response.status == 1){
//判断返回的status来确定文件是否上传成功,以及上传成功后要做的操作
}
alert(response.msg);
},
});
php代码最后得改一下
if(!$info){
$data = [
'status'=>0,
'msg'=>'上传失败,'.$upload->getError()
];
}else{
$data = [
'status'=>1,
'msg'=>'上传成功'
];
}
echo json_encode($data);die; //这样ajax用json接收才能正确弹出php返回的信息
//或者return $this->ajaxReturn($data);
首先, 哪怕是测试代码, 换行啊,命名啊,缩进啊,也一定要规范, 因为你是给别人看的, 同理,代码也不要直接上图片, markdown语法稍微看一眼, 再说SF的markdown编辑器也挺好用的
好了, 吐槽结束, 开始回答问题:
「怎么我在控制器完全不用post过来数据呢?」
答: 既然你发现不用你给数据,那么就证明数据是ThinkPHP的 Upload
类完成了这一工作, 所以咱们去找一下.
Upload
类文件位于 ThinkPHP/Library/Think
目录下的 Upload.class.php
文件中.
先看一下是不是 __construct
中获取的数据呢?
不贴代码了, 题主自己去看下吧, 结果是不是.
既然不是, 那就去找一找下面调用的 upload
方法.
/**
* 上传文件
* @param 文件信息数组 $files ,通常是 $_FILES数组
*/
public function upload($files='') {
if('' === $files){
$files = $_FILES;
}
......
}
好的, 找到了, ThinkPHP的注释也写的很清晰了, 讲明了它是使用 $_FILES
这个 超全局变量
获取的文件数据. 那么 $_FILES
这个 超全局变量
是做什么的呢? 移步: PHP文档
下一个问题:
「怎么改能按了提交就显示出来?」
答: 先打印出自己成功获取到的文件数据与路径, 然后在 $.ajax
的 success
回调中, 向 body
中插入 img
标签, src
属性为刚刚获取到的图片路径.