【问题标题】:Codeigniter: 'You did not select a file to upload', when data sent through AjaxCodeigniter:“您没有选择要上传的文件”,当通过 Ajax 发送数据时
【发布时间】:2017-11-22 13:35:19
【问题描述】:

我正在尝试通过 Ajax 和 Codeigniter 插入表单数据,但无法插入数据,出现“您没有选择要上传的文件”错误。文件上传面临问题。我不知道如何通过 jQuery ajax 传递输入文件数据。

这是我的 jQuery 代码:

$('#saveAddress').click(function(event){
        event.preventDefault();
        var add = $('#address').val();
        var city = $('#city').val();
        var state = $('#sate').val();
        var district = $('#district').val();
        var pcode = $('#pincode').val();
        var pType = $('#proofType').val();
        var aProof = new FormData($('#addressProof'));
        if(add != "" && city != "" && state != "" && district != "" && pcode != "" && pType != "" && aProof != ""){
            $.ajax({
                type:"POST",
                url:"<?php echo base_url();?>index.php/MyApp/addressDetails",
                data:{address:add,city:city,state:state,district:district,pincode:pcode,proofType:pType,addressProof:aProof},
                contentType: false,
                processData: false,
                beforeSend: function() {
                    jQuery('#pbo-loader').css('display','block');
                },
                success:function(response){
                    console.log(response);
                },
                error: function(jqXHR) { 
                    console.log(jqXHR); 
                },
                complete:function(){
                    jQuery('#pbo-loader').css('display','none');
                }
           });   
        }
    });

控制器代码:

public function addressDetails(){
            if($this->session->userdata('currently_logged_in')){
                $pbonum = $this->session->userdata('pbonum');
                if(isset($_POST)){
                    $noti['add'] = $this->input->post('address');
                    $noti['img'] = $this->input->post('addressProof');
                    $thumb = 'addressProof_'.$pbonum;
                    $config['file_name']            = $thumb;
                    $config['upload_path']          = 'uploads/kyc/address/';
                    $config['allowed_types']        = 'gif|jpg|png|pdf|doc';
                    $config['max_size']             = 2000;
                    $this->load->library('upload');
                    $this->upload->initialize($config);
                    if ( ! $this->upload->do_upload('addressProof'))
                    {
                            $noti['error'] = array('error' => $this->upload->display_errors());
                    }
                    else
                    {
                        $data = array('upload_data' => $this->upload->data());
                        $thumb = $data['file_name'];
                        $res = $this->CustomerModel->updateAddressDetails($thumb);
                        if($res == 1){
                            $noti['status'] = "success";
                        }
                        else{
                            $noti['status'] = "failed";
                        }
                    }
                    print_r($noti);
                }
            }
            else{
                $this->load->view('templates/header');  
                $this->load->view('signin');
                $this->load->view('templates/footer');  
            }
        }

【问题讨论】:

  • 您不能使用纯ajax提交发送文件。使用 jquery 表单插件模拟多部分表单提交:malsup.com/jquery/form 并且不要将表单设置为多部分
  • @ali 你错了 - FormData 对象能够做到这一点。 @akhil 试试var aProof = new FormData($('#addressProof')[0]); 因为你需要在这里使用标准的javascript对象

标签: php jquery ajax codeigniter


【解决方案1】:

为了实现你想要的,你需要在这里使用标准的 javascript 对象

var aProof = new FormData($('#addressProof')[0]);

另外,你不需要手动设置数据,试试下面的代码

$.ajax({
    type:"POST",
    url:"<?php echo base_url();?>index.php/MyApp/addressDetails",
    data:aProof,
    contentType: false,
    processData: false,
    beforeSend: function() {
        jQuery('#pbo-loader').css('display','block');
    },
    success:function(response){
        console.log(response);
    },
    error: function(jqXHR) { 
        console.log(jqXHR); 
    },
    complete:function(){
        jQuery('#pbo-loader').css('display','none');
    }
});   

【讨论】:

  • 成功了,非常感谢!为什么我们需要将 [0] 赋予表单 id?
  • 因为 $('#addressProof') 为您提供 jQuery 对象,而 $('#addressProof')[0] 为您返回本机 javascript dom 对象,并且由于 FormData 是本机 JS 对象(ant 不是 jQuery 对象)-您必须传递一个因此,本机 JS 对象 - 有关更多信息,请阅读文章 learn.jquery.com/using-jquery-core/faq/…
猜你喜欢
  • 2013-07-26
  • 1970-01-01
  • 2016-03-13
  • 2014-03-05
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多