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

CodeIgniter文件上传报错:未选择上传文件问题求助

解决CodeIgniter Ajax文件上传无法获取文件的问题

我来帮你搞定这个文件上传的问题,你遇到的核心问题是Ajax请求没有正确处理文件数据,还有几个细节配置错误,下面一步步给你修正:

问题分析

  1. 表单enctype属性错误:你写的是multipart-form-data,正确格式应该是multipart/form-data,这个属性是表单能传输文件数据的基础。
  2. Ajax序列化方式错误:serialize()只能处理文本类型的表单数据,文件属于二进制数据,必须用FormData对象来封装才能正确传输。
  3. 控制器上传路径错误:base_url()返回的是URL地址,而CodeIgniter上传类需要的是服务器本地的文件系统路径,用URL会导致上传失败。
  4. 多文件处理缺失:你的表单设置了multiple="multiple",但原控制器代码只处理了单文件情况,需要循环处理多个上传文件。

修改后的代码

1. 修正表单的enctype属性

<form action="#" id="formParking" enctype="multipart/form-data">
 <div class="input-group">
 <div class="col-xs-12 col-sm-4 no_padding">
 <label class="">Attachment</label>
 </div>
 <div class="col-xs-12 col-sm-8">
 <div class="col-xs-12 no_space"><input type="file" id="images" name="images" multiple="multiple" /></div>
 </div>
 </div>
 <div class="input-group">
 <div class="col-xs-12 col-sm-4 no_padding">
 </div>
 <div class="col-xs-12 col-sm-8">
 <a class="btn blue green text-center" id="btnSave" onclick="saveParking()" >Add</a>
 </div>
 </div>
</form>

2. 重写Ajax请求,使用FormData

function saveParking() {
 var url = "link_to_controller_function";
 // 用表单元素创建FormData对象,自动包含所有表单数据(包括文件)
 var formData = new FormData(document.getElementById('formParking'));
 
 $.ajax({
 url : url,
 type: "POST",
 data: formData,
 dataType: "JSON",
 // 这两个选项必须设为false,禁止jQuery自动处理数据和设置Content-Type
 processData: false,
 contentType: false,
 success: function(data) {
 if(data.status) {
 location.reload();
 }
 },
 error: function (jqXHR, textStatus, errorThrown) {
 alert('Error adding / update data');
 }
 });
}

3. 修正控制器的上传配置和多文件处理

// 使用CodeIgniter内置常量FCPATH,指向项目根目录的本地路径
$config['upload_path'] = FCPATH . 'uploads/';
// 自动创建uploads目录(如果不存在),确保有写入权限
if (!is_dir($config['upload_path'])) {
    mkdir($config['upload_path'], 0755, true);
}
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100; // 单位是KB,这里限制100KB
$config['max_width'] = 11111;
$config['max_height'] = 76118;

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

// 处理多文件上传(因为表单设置了multiple)
if (!empty($_FILES['images']['name'])) {
    $uploadedFiles = [];
    // 循环遍历每个上传的文件
    foreach ($_FILES['images']['name'] as $key => $fileName) {
        // 重新构造单文件的$_FILES数组,适配CodeIgniter的上传类
        $_FILES['single_image']['name'] = $_FILES['images']['name'][$key];
        $_FILES['single_image']['type'] = $_FILES['images']['type'][$key];
        $_FILES['single_image']['tmp_name'] = $_FILES['images']['tmp_name'][$key];
        $_FILES['single_image']['error'] = $_FILES['images']['error'][$key];
        $_FILES['single_image']['size'] = $_FILES['images']['size'][$key];
        
        if ($this->upload->do_upload('single_image')) {
            $uploadedFiles[] = $this->upload->data();
        } else {
            // 上传失败时返回错误信息
            echo json_encode(['error' => $this->upload->display_errors()]);
            return;
        }
    }
    // 所有文件上传成功,返回状态和数据
    echo json_encode(['status' => true, 'upload_data' => $uploadedFiles]);
} else {
    echo json_encode(['error' => 'You did not select a file to upload.']);
}

额外注意事项

  • 确保项目根目录下的uploads文件夹有写入权限(一般设置为755权限,根据服务器环境调整)。
  • 如果不需要多文件上传,去掉表单里的multiple="multiple",控制器里直接用$this->upload->do_upload('images')即可。

内容的提问来源于stack exchange,提问作者Usama Iftikhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:12