You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AJAX在CodeIgniter中上传PDF?AJAX脚本报错排查

解决CodeIgniter中AJAX上传PDF文件的问题

哦,我一眼就看出问题所在了——你用了$(this).serialize()来处理表单数据,但这个方法根本没法处理文件上传!serialize()只能序列化文本类型的表单字段,文件是二进制数据,得用FormData对象才行。下面给你一步步修正方案:

1. 修正AJAX脚本核心问题

你需要把serialize()替换成FormData,同时调整AJAX的两个关键参数,具体代码如下:

$("#form").submit(function(e){
    // 先阻止表单默认提交行为,避免页面跳转
    e.preventDefault();
    
    // 创建FormData对象,自动包含表单所有数据(包括文件)
    var formData = new FormData(this);
    
    $.ajax({
        type:"POST",
        url: base_url+"car/save_car",
        data: formData, // 用FormData替代serialize()
        dataType:"json",
        // 这两个参数必须设置为false,否则jQuery会破坏FormData的结构
        processData: false,
        contentType: false,
        beforeSend:function() {
            $("#loading-box").show();
            $("#btn-save").addClass("disabled");
        },
        success: function(res) {
            $("#loading-box").hide();
            var msg="";
            if(res.error) {
                // 这里补全你的错误提示逻辑,比如:
                $("#alert-box").html('<div class="alert alert-danger">'+res.msg+'</div>');
            } else {
                // 补全成功逻辑,比如:
                $("#alert-box").html('<div class="alert alert-success">文件上传成功!</div>');
                $("#form")[0].reset(); // 重置表单
            }
            $("#btn-save").removeClass("disabled");
        },
        // 新增错误处理,方便排查问题
        error: function(xhr, status, err) {
            $("#loading-box").hide();
            $("#btn-save").removeClass("disabled");
            $("#alert-box").html('<div class="alert alert-danger">请求出错:'+err+'</div>');
        }
    });
});

2. 服务器端CodeIgniter处理逻辑

确保你的car控制器的save_car方法能正确接收并处理上传文件:

public function save_car() {
    // 配置上传参数
    $config['upload_path'] = './uploads/pdf/'; // 确保这个目录存在且有写入权限
    $config['allowed_types'] = 'pdf'; // 只允许PDF文件
    $config['max_size'] = 2048; // 限制2MB,可按需调整
    $config['file_name'] = uniqid().'.pdf'; // 生成唯一文件名,避免覆盖

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

    // 处理上传(注意这里的'pdf_file'是你表单中文件输入框的name属性)
    if ( ! $this->upload->do_upload('pdf_file')) {
        // 上传失败,返回错误信息
        echo json_encode([
            'error' => true,
            'msg' => $this->upload->display_errors()
        ]);
    } else {
        // 上传成功,获取文件信息
        $upload_data = $this->upload->data();
        
        // 这里可以添加将文件路径存入数据库等业务逻辑
        // 示例:$this->car_model->save_car_record($upload_data['full_path']);
        
        echo json_encode([
            'error' => false,
            'msg' => 'PDF文件上传成功!'
        ]);
    }
}

3. 额外注意事项

  • 表单中的文件输入框必须有name属性,比如:<input type="file" name="pdf_file" accept=".pdf">
  • 服务器端的./uploads/pdf/目录必须存在,并且设置正确的写入权限(一般设为755)
  • 如果你的CodeIgniter开启了CSRF保护,需要把CSRF Token加入FormData,可在创建FormData后添加:
    formData.append('<?php echo $this->security->get_csrf_token_name(); ?>', '<?php echo $this->security->get_csrf_hash(); ?>');
    

内容的提问来源于stack exchange,提问作者Gusti Erlangga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:37:01