Codeigniter使用jquery和ajax错误上传图片

时间:2017-10-23 09:31:37

标签: php ajax codeigniter file upload

我需要有关以下查询的指导 我正在尝试上传文件或将文件移动到所需的目录,但它失败了。在表单上,​​除了输入[' file']数据之外,所有其他字段数据都传递给控制器​​。
请仔细阅读以下代码。

查看:
使用Bootstrap Modal显示表单,仅发布最小代码

<form method="post" action="<?php //echo base_url().'admin/students/update_accomodation'; ?>" id="accform" enctype="multipart/form-data">
        <div class="form-group">
            <div class="row">
                    <div class="col-md-2">
                        <label>Students</label>
                    </div>
                    <div class="col-md-4">
                        <input type="text" name="student" value="" />
                    </div>  
                    <div class="col-md-2">
                        <label>Room</label>
                    </div>
                    <div class="col-md-4">
                        <input type="text" name="room" value="" />
                    </div>
            </div>      
        </div>
        <div class="form-group">
            <div class="row">
                    <div class="col-md-2">
                        <label>Stay</label>
                    </div>
                    <div class="col-md-4">
                        <select name="stay" class="form-control" id="stay">
                            <option value="1">1 Month</option>
                            <option value="2">2 Month</option>
                            <option value="3">3 Month</option>
                            <option value="4">4 Month</option>
                            <option value="5">5 Month</option>
                            <option value="6">6 Month</option>
                            <option value="7">7 Month</option>
                            <option value="8">8 Month</option>
                            <option value="9">9 Month</option>
                            <option value="10">10 Month</option>
                            <option value="11">11 Month</option>
                            <option value="12">12 Month</option>
                            <option value="18">18 Month</option>
                            <option value="24">24 Month</option>
                            <option value="36">36 Month</option>
                        </select>
                    </div>
                    <div class="col-md-2">
                        <label>Upload PDF</label>
                    </div>
                    <div class="col-md-4">
                        <input type="file" name="file" id="file" class="btn btn-default btn-file" />
                    </div>
            </div>  
        </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    <button type="submit" class="btn btn-primary accomodation">Submit</button>
  </div>
    </form>

的Ajax
在同一页面和页脚中,jquery.js文件正在加载,文件字段数据以外的其他文件也传递给控制器​​。

<script>
$(document).ready(function()  {
    $(".accomodation").click(function(event)  {
        event.preventDefault();
        //var formData = $('#accform').serialize();
       // var formData = new FormData($(this)[0]);
        //var formData = $('#accform').formSerialize();
        //console.log(formData);
        //alert(JSON.stringify(formData));
        $.ajax({
            type: "POST",
            url: "<?php echo site_url('admin/students/update_accomodation'); ?>",
            data: $('#accform').serialize(),
            //data: new FormData($("#accform")[0]),
            processData: false,
            success: function(res)  {
                //var json = JSON.parse(res);
                var parsed = res;
                console.log(parsed);
                if(parsed.status_code == 1) {
                    alert('data inserted successfully');
                    window.location.href = "<?php echo site_url('admin/bookings'); ?>";
                }else {
                    alert(parsed.status);
                }
            }

        });
    });       
});

控制器

function update_accomodation()  {
    //form input validation
    $this->form_validation->set_rules('student_id','Student ID','trim|required');
    $this->form_validation->set_rules('room_id','Room ID','trim|required');
    $this->form_validation->set_rules('stay','stay','required');
    if (empty($_FILES['file']['name'])) {                        //check file is selected
        $this->form_validation->set_rules('file','File','required');
    }
    if($this->form_validation->run() == FALSE)  {               //form validation false
        $data = array(
            'status' => validation_errors(),
            'status_code' => 2
        );
        echo json_encode($data);
    }   else    {          
        //echo json_encode(array('data' => $_FILES['file']['name']));
        //form validation true
        if (0 < $_FILES['file']['error']) {
            $data = array(
                'status' => 'File uploading error',
                'status_code' => 3
            );
            echo json_encode($data);
    }   else    {
            $sourcePath = $_FILES['file']['tmp_name'];          //filename="file" 
            $targetPath = "uploads/students/contracts/".rand(0,10000).$_FILES['file']['name'];      //targetpath with random number as prefix
            move_uploaded_file($sourcePath,$targetPath);                                //move file to target folder
            $data1 = array(                                             //take inputs
                'stay' => $this->input->post('firstname'),
                'id_upload' => $targetPath
            );
            $data = array(
                'status' => 'upload successfully',
                'status_code' => 1
            );
            echo json_encode($data);
    }
}
}

我遇到的错误:
1)输入[&#39;文件&#39;]值未通过,只输入[&#39; text&#39;]和其他值传递。
2)输入[&#39;文件&#39;]的表单验证错误(因为文件值未通过,所以在场外)。

到目前为止我做了什么:
1)我尝试了多种类型来接受表单数据,我在ajax中对它进行了评论。
2)我尝试了jquery.form.min.js插件(链接:http://malsup.com/jquery/form/)。使用此插件后,输入[&#39; file&#39;]值可以接受(在控制台中跟踪)但不传递给控制器​​,获取错误未定义变量:file。
3)ProcessData:false,contentType:false,也用。
4)enctype =&#34; multipart / form-data&#34;也包括在内。

最后提到的事情  上面的代码完全适用于另一个控制器和现有项目中的视图,我复制了相同的代码,但它不能在当前控制器上工作。需要帮助,谢谢。

更新了用户建议的AJAX代码:但它不会为我工作,因为空值传递给控制器​​

<script>
$(document).ready(function()  {
    $(".accomodation").click(function(e)  {
        e.preventDefault();
        var formData = new FormData(this);
        $.ajax({
            type: "POST",
            url: "<?php echo site_url('admin/students/update_accomodation'); ?>",
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            success: function(res)  {
                console.log(res);
            }

        });
    });       
});

接受纠正的答案 以下为我的回答工作,非常感谢你。

var form = $('#accform');
var formData = new FormData(form[0]);

相反

var formData = new FormData(this);

1 个答案:

答案 0 :(得分:0)

.serialize()无法接受使用Jquery&amp;上传文件Axaj。

实现此目的

$(document).ready(function (e) {
    $('.accomodation').on('submit',(function(e) {
        e.preventDefault();
        var formData = new FormData(this);

        $.ajax({
            type:'POST',
            url: $(this).attr('action'),
            data:formData,
            cache:false,
            contentType: false,
            processData: false,
            success:function(data){
                console.log("success");
                console.log(data);
            },
            error: function(data){
                console.log("error");
                console.log(data);
            }
        });
    }));
  }));