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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:45