thinkphp3.2.3 ajax上传图片

控制器代码

clipboard.png

html代码

clipboard.png

怎么改能按了提交就显示出来?这个thinkphp这个post数据是怎么用的,怎么我在控制器完全不用post过来数据呢?

阅读 7.3k
2 个回答

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文档

下一个问题:

「怎么改能按了提交就显示出来?」

答: 先打印出自己成功获取到的文件数据与路径, 然后在 $.ajaxsuccess 回调中, 向 body 中插入 img 标签, src 属性为刚刚获取到的图片路径.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题