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

CodeIgniter3动态文件上传字段:媒体标题与文件存储问题

解决CodeIgniter动态字段媒体文件上传与存储问题

1. 前端表单必须添加enctype="multipart/form-data"

文件上传的表单必须声明该属性,否则后端无法获取文件数据。示例代码:

<form method="post" action="你的控制器方法" enctype="multipart/form-data">
  <!-- 动态字段容器及其他表单内容 -->
</form>

2. 后端调整文件上传逻辑(核心修正)

CodeIgniter中,文件上传数据不在POST数组内,而是存储在$_FILES全局数组中,需对应动态字段结构获取。同时使用框架Upload类处理上传流程:

控制器修改示例

// 加载CodeIgniter上传类
$this->load->library('upload');

if (isset($section['media'])) {
    foreach ($section['media'] as $mediaIndex => $media) {
        $mediaTitle = $media['media_title'];
        // 拼接动态字段对应的文件索引键
        $fileKey = "sections[{$sectionId}][media][{$mediaIndex}][media_name]";
        
        // 检查是否有文件被上传
        if (!empty($_FILES[$fileKey]['name'])) {
            // 上传配置
            $config['upload_path'] = './uploads/lessons/'; // 确保目录存在且有写入权限
            $config['allowed_types'] = 'jpg|jpeg|png|mp4|pdf'; // 根据业务需求调整允许的文件类型
            $config['file_name'] = uniqid() . '_' . $_FILES[$fileKey]['name']; // 添加唯一前缀避免文件名冲突
            $config['overwrite'] = FALSE;
            $config['max_size'] = 2048; // 限制文件大小,单位KB(可选)

            $this->upload->initialize($config);
            
            if ($this->upload->do_upload($fileKey)) {
                $uploadData = $this->upload->data();
                $savedFileName = $uploadData['file_name']; // 获取上传后的最终文件名
                // 将标题与文件名同步存入数据库
                $this->ExamModel->save_lesson($sectionId, $mediaTitle, $savedFileName);
            } else {
                // 处理上传错误,例如记录日志或返回提示
                $error = $this->upload->display_errors();
                // 可根据需求选择跳过该文件或中断流程
            }
        } else {
            // 未选择文件时的处理逻辑,例如跳过或存入空值(根据业务需求调整)
        }
    }
}

3. 数据库与模型层验证

确保save_lesson方法正确接收参数,且数据库表中media_name字段长度足够存储文件名(建议设置为VARCHAR(255)):

模型示例(ExamModel.php)

public function save_lesson($sectionId, $mediaTitle, $mediaName) {
    $data = [
        'section_id' => $sectionId,
        'media_title' => $mediaTitle,
        'media_name' => $mediaName
    ];
    return $this->db->insert('你的表名', $data);
}

4. 关键注意事项

  • 上传目录./uploads/lessons/必须存在,且服务器需具备写入权限(可设置权限为755或777,根据服务器配置调整)。
  • 动态字段的$mediaIndex和$sectionId需与前端生成的索引完全对应,确保$fileKey能正确定位$_FILES中的数据。
  • 可根据业务需求扩展上传配置,例如添加文件类型白名单、限制文件尺寸等。

内容的提问来源于stack exchange,提问作者Jonald Penpillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:45:07