CodeIgniter上传类如何拒绝同名文件并要求用户重命名
解决CodeIgniter上传文件名存在时拒绝上传的问题
问题根源分析
你的核心逻辑方向是对的,但问题大概率出在路径拼接不严谨或上传类配置顺序/参数错误上:
- 若
$folder缺少末尾斜杠或为相对路径,会导致file_exists判断失效 - 若
$config['overwrite']设为TRUE,即使前置判断生效,上传类执行时仍会强制覆盖原有文件
修正后的完整代码实现
// 替换为你的表单上传字段名 $field_name = 'csv_file'; // 获取上传文件名并统一转小写 $uploaded_file_name = strtolower($_FILES[$field_name]['name']); // 标准化路径拼接:移除末尾斜杠后再拼接文件名,避免路径格式错误 $target_file_path = rtrim($folder, '/') . '/' . $uploaded_file_name; // 第一步:优先判断文件是否已存在 if (file_exists($target_file_path)) { $message = 'Please rename your file'; $this->session->set_flashdata('flash_message', $message); redirect('pengumuman-new', 'refresh'); } // 第二步:文件不存在时,配置上传类并执行上传 $config['upload_path'] = $folder; $config['allowed_types'] = 'csv'; // 严格限制仅允许CSV文件 $config['file_name'] = $uploaded_file_name; $config['overwrite'] = FALSE; // 关键配置:禁止覆盖,双重保障避免文件被替换 $config['max_size'] = 0; // 根据业务需求设置文件大小上限,0表示无限制 // 初始化并执行上传 $this->load->library('upload', $config); if (!$this->upload->do_upload($field_name)) { // 上传失败处理 $error_msg = $this->upload->display_errors(); $this->session->set_flashdata('flash_message', $error_msg); redirect('pengumuman-new', 'refresh'); } else { // 上传成功后的后续逻辑(如记录数据库、跳转成功页等) $upload_result = $this->upload->data(); redirect('pengumuman-new', 'refresh'); }
额外优化建议
- 使用绝对路径:将
$folder改为绝对路径避免判断错误,示例:$folder = FCPATH . 'uploads/csv_storage'; // FCPATH是CodeIgniter内置的网站根目录常量 - 强化文件类型验证:除了后缀名,额外验证MIME类型确保是真实CSV文件:
$allowed_mimes = ['text/csv', 'application/vnd.ms-excel', 'application/csv']; if (!in_array($_FILES[$field_name]['type'], $allowed_mimes)) { $this->session->set_flashdata('flash_message', 'Only valid CSV files are allowed'); redirect('pengumuman-new', 'refresh'); } - 目录权限检查:确保
$folder目录具备写入权限,否则上传失败会混淆错误原因
内容的提问来源于stack exchange,提问作者harmoni creative
相关产品推荐
相关产品推荐

