CodeIgniter动态文件名文件上传时POST数据为空问题求助
解决CodeIgniter中动态name文件上传的问题
我来帮你理清楚问题出在哪,以及怎么修复:
核心问题分析
- 表单缺少文件上传必备属性:你的表单没有添加
enctype="multipart/form-data",这是浏览器能正确发送文件数据的必要条件,没有它的话,文件根本不会被提交,而且multipart模式下$this->input->post()本来就不会包含文件输入框的内容——文件信息都存在$_FILES数组里。 - 错误的循环逻辑:你试图通过遍历
$this->input->post()来获取test_id,但multipart表单下这个数组里不会有文件输入的项,应该直接遍历$_FILES数组,它的键就是你设置的动态test_id。 - 上传方法调用错误:
do_upload()的参数应该是文件输入框的name值(也就是test_id),而不是去post里取值,因为multipart下post里拿不到这个值。 - 不合理的配置参数:
max_size的单位是KB,你设置的5000000000000相当于5TB,这显然不合理,会导致配置失效或者服务器报错。
修改后的代码
视图部分(添加enctype属性)
<form action="<?php echo base_url(); ?>index.php/Hospital/addTest/<?php echo $appoinmentData->app_id; ?>" role="form" method='post' enctype="multipart/form-data" <!-- 必须添加这个属性 --> onmouseover="return form_validate()" name="vform"> <div class=""> <ul class="to_do"> <?php foreach ($testData as $test) { echo ' <li> <p> '.$test->test_name.' </p> </br> <input type="file" class="btn btn-primary" name="'.$test->test_id.'"> </li> '; } ?> </ul> </div> <input type="submit" class="btn btn-success btn-lg btn-block" value="Update" name=""> </form>
控制器部分(重构上传逻辑)
public function addTest($app_id) { // 获取登录医院ID $hospital_id = $this->session->userdata['loggedHospitalData']['hp_id']; // 初始化上传配置(只需要做一次) $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'pdf|jpg|png'; // 建议限制文件类型,比*更安全 $config['max_size'] = 5000; // 单位KB,这里设置为5MB,按需调整 $config['max_width'] = 10240; $config['max_height'] = 10240; // 加载上传库 $this->load->library('upload', $config); // 遍历所有上传的文件,键就是动态生成的test_id foreach ($_FILES as $test_id => $file) { // 跳过用户未选择文件的情况 if ($file['error'] === UPLOAD_ERR_NO_FILE) { log_message('info', 'Test ID ' . $test_id . ' 未上传文件'); continue; } // 重新初始化上传配置(确保每次上传都是干净的配置) $this->upload->initialize($config); // 执行上传,参数直接用test_id(也就是文件输入框的name) if (!$this->upload->do_upload($test_id)) { // 处理上传错误,比如记录日志 $error_msg = $this->upload->display_errors(); log_message('error', 'Test ID ' . $test_id . ' 上传失败:' . $error_msg); } else { // 上传成功,获取文件信息 $upload_data = $this->upload->data(); $file_name = $upload_data['file_name']; // 更新数据库,关联test_id和文件路径 $update_data = array( "hospital_id" => $hospital_id, "file" => './uploads/' . $file_name // 存储完整文件路径 ); $this->Hospital_model->updateTestData($update_data, array("test_id" => $test_id)); } } // 使用CodeIgniter内置的跳转方法,比header更可靠 redirect('Hospital/patientView/' . $app_id); }
额外注意事项
- 确保
./uploads/目录有写入权限,否则上传会失败。 allowed_types设置为*会允许所有文件类型,存在安全风险,建议根据业务需求限制为特定类型(比如报告常用的pdf、图片格式)。- 如果需要给用户反馈上传结果,可以把错误信息存入session,在跳转后的页面显示。
内容的提问来源于stack exchange,提问作者devaka dabare
相关产品推荐
相关产品推荐

