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

