CodeIgniter文件上传报错:未选择上传文件问题求助
解决CodeIgniter Ajax文件上传无法获取文件的问题
我来帮你搞定这个文件上传的问题,你遇到的核心问题是Ajax请求没有正确处理文件数据,还有几个细节配置错误,下面一步步给你修正:
问题分析
- 表单enctype属性错误:你写的是
multipart-form-data,正确格式应该是multipart/form-data,这个属性是表单能传输文件数据的基础。 - Ajax序列化方式错误:
serialize()只能处理文本类型的表单数据,文件属于二进制数据,必须用FormData对象来封装才能正确传输。 - 控制器上传路径错误:
base_url()返回的是URL地址,而CodeIgniter上传类需要的是服务器本地的文件系统路径,用URL会导致上传失败。 - 多文件处理缺失:你的表单设置了
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
相关产品推荐
相关产品推荐

