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

CodeIgniter 3 文件上传报错:上传路径无效问题求助

问题解决:CodeIgniter 3 文件上传路径无效错误及完整实现

1. 核心错误排查与修复

你的代码里存在路径覆盖+拼写错误:

  • 先设置了正确的绝对路径FCPATH . 'uploads/',但紧接着又覆盖成了./upload/,路径少了一个s,和实际的uploads文件夹不匹配。
  • 相对路径./upload/可能因CodeIgniter执行上下文出现解析问题,推荐用绝对路径FCPATH . 'uploads/'更可靠。

修正后的控制器代码:

public function add_details()
{
    // 正确配置上传路径,使用绝对路径避免上下文解析问题
    $config['upload_path'] = FCPATH . 'uploads/';
    $config['allowed_types'] = 'jpg|png|jpeg';
    $config['max_size'] = 2048; // 单位KB,即2MB

    // 自动创建上传目录(如果不存在)
    if (!is_dir($config['upload_path'])) {
        mkdir($config['upload_path'], 0777, true);
    }

    $this->load->library('upload', $config);

    if (!$this->upload->do_upload('image')) {
        $error = $this->upload->display_errors();
        log_message('error', 'File upload failed: ' . $error);
        $this->session->set_flashdata('error', '文件上传失败: ' . $error);
    } else {
        $imageData = $this->upload->data();
        // 存储相对路径而非完整URL,后续可灵活拼接base_url
        $record = [
            'title' => $this->input->post('title'),
            'description' => $this->input->post('description'),
            'image' => 'uploads/' . $imageData['file_name']
        ];

        if ($this->DashboardModel->add_details($record)) {
            $this->session->set_flashdata('success', '详情添加成功。');
        } else {
            $this->session->set_flashdata('error', '详情存入数据库失败。');
        }
    }

    redirect(base_url('dashboard'));
}

2. 模型层(DashboardModel)实现

确保模型包含数据插入和查询方法:

class DashboardModel extends CI_Model {
    // 插入详情到数据库
    public function add_details($record) {
        // 替换为你的实际表名,比如`details`
        return $this->db->insert('details', $record);
    }

    // 查询所有详情,用于视图展示
    public function get_all_details() {
        return $this->db->get('details')->result();
    }
}

3. 视图层展示实现

在dashboard对应的视图文件(如dashboard.php)中,完成表单上传和数据展示:

<!-- 显示上传状态提示 -->
<?php if ($this->session->flashdata('error')): ?>
    <div class="alert alert-danger">
        <?php echo $this->session->flashdata('error'); ?>
    </div>
<?php endif; ?>

<?php if ($this->session->flashdata('success')): ?>
    <div class="alert alert-success">
        <?php echo $this->session->flashdata('success'); ?>
    </div>
<?php endif; ?>

<!-- 展示已上传的详情和图片 -->
<div class="details-list">
    <?php foreach ($details as $item): ?>
        <div class="detail-item">
            <h3><?php echo htmlspecialchars($item->title); ?></h3>
            <p><?php echo htmlspecialchars($item->description); ?></p>
            <!-- 拼接完整URL展示图片 -->
            <img src="<?php echo base_url($item->image); ?>" alt="<?php echo htmlspecialchars($item->title); ?>" style="max-width: 300px;">
        </div>
    <?php endforeach; ?>
</div>

<!-- 文件上传表单(必须加enctype属性) -->
<form action="<?php echo base_url('dashboard/add_details'); ?>" method="post" enctype="multipart/form-data">
    <div>
        <label for="title">标题:</label>
        <input type="text" name="title" id="title" required>
    </div>
    <div>
        <label for="description">描述:</label>
        <textarea name="description" id="description" required></textarea>
    </div>
    <div>
        <label for="image">图片:</label>
        <input type="file" name="image" id="image" accept="image/jpg,image/png,image/jpeg" required>
    </div>
    <button type="submit">提交</button>
</form>

4. 额外注意事项

  • 表单必须添加enctype="multipart/form-data"属性,否则无法接收上传文件。
  • 数据库image字段建议设为VARCHAR(255),足够存储相对路径。
  • 生产环境不建议用777权限,可调整为755,并确保文件夹所属用户与Web服务器一致(如www-data)。

内容的提问来源于stack exchange,提问作者Shalat 221722

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:43:11