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
相关产品推荐
相关产品推荐

