【问题标题】:Cannot upload image using AJAX Codeigniter无法使用 AJAX Codeigniter 上传图片
【发布时间】:2020-07-02 08:29:37
【问题描述】:

我正在尝试将图像上传到 phpmyadmin 数据库并选择 BLOB 类型用于数据库中的图像存储,我正在尝试使用 jQuery 上传图像,但问题是我的 new FormData(this) 不是表单中的任何值并且由于在进入控制器功能后 if 没有进入 if condition 并移向 else 并在发生某些错误时返回响应。

我尝试了许多不同的方法来传递数据,但都没有奏效:

  • 数据:new FormData(this),
  • 数据:new FormData($('#upload_image')[0]),
  • 数据:{ fileName: $("input[name='imageFile']").val().split("\\").pop() }
  • 数据:{ file: $("input[name='imageFile']").val() }

我的观点

<!DOCTYPE html>
<html>
<head>
    <title><?php echo $title; ?></title>
    <link rel="stylesheet" type="text/css" href="<?php echo base_url(); ?>assets/bootstrap/css/bootstrap-grid.min.css">
    <link rel="stylesheet" type="text/css" href="<?php echo base_url(); ?>assets/bootstrap/css/bootstrap-reboot.min.css">
    <link rel="stylesheet" type="text/css" href="<?php echo base_url(); ?>assets/bootstrap/css/bootstrap.min.css">
    <script src="https://use.fontawesome.com/e26d097cd9.js"></script>

</head>
<body>
    <div class="container">
        <br><br><br>
        <h3 class="text-center">Uploading Image Using AJAX</h3>
        <div id="message"></div>
        <form method="POST" id="upload_image" enctype="multipart/form-data">
            <input type="file" name="imageFile" id="image_file">
            <br><br>
            <button type="submit" class="btn btn-info" name="upload" id="upload">Upload </button>
        </form>
        <div class="uploaded_image">

        </div>
    </div>

    <!-- <script type="text/javascript" src="<?php echo base_url(); ?>assets/bootstrap/js/jquery.js"></script> -->
    <script type="text/javascript" src="<?php echo base_url(); ?>assets/bootstrap/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="<?php echo base_url(); ?>assets/bootstrap/js/bootstrap.bundle.min.js"></script>
    <script type="text/javascript" src="<?php echo base_url(); ?>assets/bootstrap/js/bootstrap.min.js"></script>

    <script type="text/javascript">
        $('#upload_image').submit(function(e){
        // $('#upload_image').on('submit', function(e){
            e.preventDefault();
            // var formData = $('#uploaded_image').serialize();
            // alert(formData);
            if($('#image_file').val() == ''){
                alert('Please Attach a File');
            }
            else{
                // alert("Hello");
                $.ajax({
                    url: "<?php echo base_url(); ?>main/ajax_upload",
                    type: "POST",
                    // data:new FormData(this),
                    data: new FormData($('#upload_image')[0]),
                    // data: {
                    //  fileName: $("input[name='imageFile']").val().split("\\").pop(),
                    //  // file: $("input[name='imageFile']").val()
                    // },
                    // data: new FormData($('#upload_image')[0]),
                    contentType: false,
                    cache: false,
                    processType: false,
                    dataType: 'JSON',
                    beforeSend: function(){
                        $('#upload').append('<i class="fa fa-spinner fa-spin"></i>');
                    },
                    success: function(data){
                        $('#upload .fa-spinner').remove();
                        $('#uploaded_image').html(data);

                        $('#message').html(data.message);
                    }
                });
            }
        });
    </script>
</body>
</html>

我的控制器

public function ajax_upload(){
        // echo "<script>alert('hello')</script>";
        if(isset($_FILES['image_file']["name"])){
        // if(isset($_FILES['imageFile'])){
            $config['upload_path'] = './upload/'; 
            $config['allowed_types'] = 'jpg|jpeg|png|gif';

            $this->load->library('upload', $config);

            if(!$this->upload->do_upload('imageFile')){
                // echo $this->upload->display_errors();
                $error['message'] = $this->upload->display_errors();
                echo json_encode($error);
            }
            else{
                $data = $this->upload->data();
                // echo "<img src=" . base_url() . "upload/" . $data["file_name"] . ">";
                echo '<img src="'.base_url().'upload/'.$data["file_name"].'">';
            }
        }
        else{
            $error['message'] = "An Error Occured";
            echo json_encode($error);
        }
    }

【问题讨论】:

    标签: php ajax codeigniter image-upload


    【解决方案1】:

    在您的 ajax 配置中,您应该将 processData 设置为 false 以防止数据值转换为查询字符串:

                        processData: false,
    

    【讨论】:

    • 好的!所以现在我可以传递我的数据,但是当我调试我的代码时,形成网络部分,我得到(二进制)作为传递的文件。
    • 我认为问题在于您将输入名称设置为imageFile,但在控制器上您使用$_FILES['image_file'] 获取文件,名称不同
    • 感谢您指出错误,现在我真的很接近解决方案,但问题是现在它向我提供了一个错误 '上传路径似乎无效'. 但我的上传路径是有效的。我也尝试使用 $config['upload_path'] = './upload/'; 但同样的错误一次又一次地提供。
    • 如果您在 CI 应用程序文件夹之外(在根文件夹中)有 upload 文件夹,您可以像这样使用 FCPATH$config['upload_path'] = realpath(FCPATH . 'upload');,如果 upload 文件夹在应用程序内文件夹,你可以使用APPPATH 像:$config['upload_path'] = realpath(APPPATH . 'upload');
    • 它被放置在应用程序、系统和文件夹所在的根文件夹中;我用过 base_url() 。 '上传'FCPATH 。 'upload' 我打印整个文件路径它打印正确的文件路径
    【解决方案2】:

    在您的数据变量中,您引用了错误的表单 ID。

    应该是

    data: new FormData($('#upload_image')[0]),
    

    【讨论】:

    • 哦,对不起,这是我的错误!感谢您让我知道,但现在我的控制权没有被转移到我的控制权,并且我在控制台中收到 “Uncaught TypeError: Illegal invocation” 错误。
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多