CodeIgniter 3视图关联控制器:调用模型函数实现TXT坐标入库
别急,我来帮你一步步搞定CodeIgniter 3里的文件上传+坐标导入流程——刚好我之前也做过类似的功能,咱们从视图、控制器到模型对接逐个梳理:
1. 先搞定视图层(上传表单)
首先要做一个支持文件上传的表单,注意必须指定enctype="multipart/form-data",CI有专门的辅助函数帮我们处理这个。下面是一个简洁的视图示例:
<!-- application/views/upload_coords.php --> <!DOCTYPE html> <html> <head> <title>导入坐标文件</title> </head> <body> <h2>选择坐标TXT文件导入</h2> <!-- 显示上传错误提示 --> <?php if(isset($error)) echo "<p style='color:red;'>$error</p>"; ?> <!-- CI专用的文件上传表单打开方法 --> <?php echo form_open_multipart('coords/import'); ?> <input type="file" name="coord_file" accept=".txt" required> <br><br> <button type="submit">开始导入</button> <?php echo form_close(); ?> </body> </html>
这里的accept=".txt"能限制用户只能选择txt文件,避免无效上传;同时预留了错误提示的位置,方便反馈上传问题。
2. 控制器层(处理上传+调用模型)
控制器要完成三件核心事:验证上传文件、读取文件内容、调用模型完成导入。咱们创建一个Coords.php控制器:
// application/controllers/Coords.php class Coords extends CI_Controller { public function __construct() { parent::__construct(); // 加载需要的库、模型和辅助函数 $this->load->library('upload'); $this->load->model('Coord_model'); // 替换成你实际的模型名 $this->load->helper('form'); } // 显示上传表单的页面 public function index() { $this->load->view('upload_coords'); } // 处理导入逻辑的核心方法 public function import() { // 配置上传参数 $config['upload_path'] = './uploads/'; // 必须确保这个文件夹存在且有写入权限 $config['allowed_types'] = 'txt'; $config['max_size'] = 10240; // 限制10MB,可根据你的需求调整 $this->upload->initialize($config); // 检查上传是否成功 if (!$this->upload->do_upload('coord_file')) { // 上传失败,把错误信息传回视图 $data['error'] = $this->upload->display_errors(); $this->load->view('upload_coords', $data); } else { // 上传成功,获取文件的完整路径 $upload_data = $this->upload->data(); $file_path = $upload_data['full_path']; // 读取TXT内容(这里假设每行一个坐标,格式比如x,y,可根据你的实际格式调整) $file_content = file_get_contents($file_path); $coords_list = explode("\n", trim($file_content)); // 按行拆分坐标 // 调用你已经写好的模型导入函数 $import_result = $this->Coord_model->batch_import_coords($coords_list); // 根据模型返回的结果给出反馈 if ($import_result['success']) { echo "导入成功!共导入 {$import_result['count']} 条有效坐标"; // 也可以跳转到坐标列表页:redirect('coords/list'); } else { echo "导入失败:{$import_result['message']}"; } // 可选:删除上传的临时文件,避免服务器空间占用 unlink($file_path); } } }
这里有几个关键注意点:
- 一定要确保
./uploads/文件夹存在,并且给服务器分配写入权限(一般设置chmod 755即可) - 读取文件的逻辑要和你的txt格式匹配,如果是其他分隔符(比如空格、制表符),要调整拆分规则
- 如果你的CI开启了CSRF保护,记得在表单里加入CSRF令牌:
echo form_hidden($this->security->get_csrf_token_name(), $this->security->get_csrf_hash());
3. 模型层的适配提示(针对你已完成的模型)
虽然你说模型已经做好了,但还是给个参考示例,确保模型能正确接收控制器传来的坐标数组:
// application/models/Coord_model.php class Coord_model extends CI_Model { public function batch_import_coords($coords_list) { $success_count = 0; $error_log = []; foreach ($coords_list as $coord_line) { $coord_line = trim($coord_line); if (empty($coord_line)) continue; // 跳过空行 // 按逗号拆分x和y坐标,替换成你实际的分隔符 list($x, $y) = explode(',', $coord_line); $x = trim($x); $y = trim($y); // 验证坐标合法性(比如是否为数字) if (!is_numeric($x) || !is_numeric($y)) { $error_log[] = "无效坐标:{$coord_line}"; continue; } // 插入数据库(替换成你的表名和字段名) $data = [ 'x_axis' => $x, 'y_axis' => $y, 'created_at' => date('Y-m-d H:i:s') ]; if ($this->db->insert('coordinates', $data)) { $success_count++; } else { $error_log[] = "插入失败:{$coord_line}"; } } // 返回导入结果 if ($success_count > 0) { return [ 'success' => true, 'count' => $success_count, 'errors' => $error_log ]; } else { return [ 'success' => false, 'message' => '未找到有效坐标数据' ]; } } }
常见问题排查
如果点击提交后没反应或者报错,可以从这几个方向检查:
- 控制器和方法名是否匹配表单的action(示例里是
coords/import,对应控制器Coords的import方法) - 上传文件大小是否超过
php.ini的限制(调整upload_max_filesize和post_max_size参数) - TXT文件编码是否为UTF-8无BOM格式,避免读取到乱码内容
- 数据库表的字段类型是否和坐标数据匹配(比如x、y字段设为DECIMAL或FLOAT类型)
内容的提问来源于stack exchange,提问作者Baeyens Raphaël
相关产品推荐
相关产品推荐

