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

CodeIgniter图片上传报错:上传路径无效,请求排查错误

解决图片上传失败:"The upload path does not appear to be valid" 问题

我仔细看了你的代码,核心问题出在上传路径的错误设置上,还有几处语法和逻辑小问题,我帮你逐一排查并修正:

1. 上传路径的致命错误

你写的'upload_path' => is_dir('assets/reimburse/') . 'assets/reimburse/'完全不对——is_dir()返回的是布尔值(PHP里会转成1或0),所以最终路径会变成1assets/reimburse/或者0assets/reimburse/,这肯定不是有效的目录路径。

正确的做法是先检查目录是否存在,不存在就递归创建它,然后直接设置路径:

$upload_dir = './assets/reimburse/';
// 检查目录,不存在则创建(递归创建支持多级目录)
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0755, true);
}

2. 判断文件是否上传的语法错误

你写的if ($data['photo'] = "")是赋值操作,不是比较判断,永远会返回true。应该通过$_FILES['photo']['name']是否为空来判断是否有文件上传:

if (!empty($_FILES['photo']['name'])) {
    // 处理上传逻辑
}

3. 上传成功后未保存文件名到数据数组

你调用了$this->upload->data('file_name');但没把结果赋值给$data['photo'],这样数据库里存的还是$_FILES数组,不是实际的文件名。要改成:

$upload_data = $this->upload->data();
$data['photo'] = $upload_data['file_name'];

4. 跳转后的代码永远不会执行

比如redirect('Reimburse/index', 'refresh');之后的echo json_encode(...)完全没用,因为redirect已经发送了HTTP跳转头,浏览器会直接跳转,看不到后面的输出。你需要根据实际场景二选一:如果是AJAX请求就返回JSON,如果是页面表单提交就跳转。

修正后的完整代码

public function saveReimburse() {
    validate_submitted_data(array(
        'nama' => 'required',
        'category_reimburse_id' => 'required',
        'amount' => 'required|numeric',
        'date_reimburse' => 'required',
        // 'photo' => 'required'
    ));

    // 初始化数据数组,photo字段先设为空
    $data = [
        'nama' => $this->input->post('nama'),
        'category_reimburse_id' => $this->input->post('category_reimburse_id'),
        'amount' => $this->input->post('amount'),
        'date_reimburse' => $this->input->post('date_reimburse'),
        'photo' => '',
        'status'=> 'PENDING', // 这里应该是固定状态值,直接写字符串即可
    ];

    // 日期校验逻辑优化:把字符串转成时间戳再比较
    $current_timestamp = strtotime(date('Y-m-d'));
    $max_reimburse_timestamp = strtotime('-7 day', $current_timestamp);
    if (strtotime($data['date_reimburse']) < $max_reimburse_timestamp) {
        echo json_encode(array('success' => FALSE, 'message' => 'Max Reimburse was 1 week ago'));
        exit; // 退出避免后续代码执行
    }

    // 处理图片上传(只有上传了文件才执行)
    if (!empty($_FILES['photo']['name'])) {
        $upload_dir = './assets/reimburse/';
        // 确保目录存在
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, 0755, true);
        }

        $config = [
            'upload_path' => $upload_dir,
            'allowed_types' => 'jpg|png|gif',
            'overwrite' => TRUE
        ];

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

        // 执行上传
        if (!$this->upload->do_upload('photo')) {
            // 返回上传错误信息
            echo json_encode(array('success' => FALSE, 'message' => $this->upload->display_errors()));
            exit;
        } else {
            // 获取上传后的文件名并更新data
            $upload_data = $this->upload->data();
            $data['photo'] = $upload_data['file_name'];
        }
    }

    // 保存到数据库
    $save = $this->reimburseModel->saveReimburse('reimburse', $data);
    if (!$save) {
        echo json_encode(array('success' => FALSE, 'message' => 'Failed to record'));
    } else {
        // 根据实际场景选择:如果是AJAX请求返回JSON,否则跳转
        echo json_encode(array('success' => TRUE, 'message' => 'Reimburse Success'));
        // redirect('Reimburse/index', 'refresh'); // 页面提交时用这个,注释掉上面的echo
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:18:13