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

CodeIgniter动态文件名文件上传时POST数据为空问题求助

解决CodeIgniter中动态name文件上传的问题

我来帮你理清楚问题出在哪,以及怎么修复:

核心问题分析

  1. 表单缺少文件上传必备属性:你的表单没有添加enctype="multipart/form-data",这是浏览器能正确发送文件数据的必要条件,没有它的话,文件根本不会被提交,而且multipart模式下$this->input->post()本来就不会包含文件输入框的内容——文件信息都存在$_FILES数组里。
  2. 错误的循环逻辑:你试图通过遍历$this->input->post()来获取test_id,但multipart表单下这个数组里不会有文件输入的项,应该直接遍历$_FILES数组,它的键就是你设置的动态test_id。
  3. 上传方法调用错误:do_upload()的参数应该是文件输入框的name值(也就是test_id),而不是去post里取值,因为multipart下post里拿不到这个值。
  4. 不合理的配置参数: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);
}

额外注意事项

  1. 确保./uploads/目录有写入权限,否则上传会失败。
  2. allowed_types设置为*会允许所有文件类型,存在安全风险,建议根据业务需求限制为特定类型(比如报告常用的pdf、图片格式)。
  3. 如果需要给用户反馈上传结果,可以把错误信息存入session,在跳转后的页面显示。

内容的提问来源于stack exchange,提问作者devaka dabare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:33:41