Codeigniter图片上传成功但视频上传失败,encrypt_name失效求助
Codeigniter 图片/视频上传问题修复方案
核心问题拆解
- Upload库未重新初始化:第一次加载上传库后,第二次直接调用
load->library不会覆盖原有配置,导致视频的encrypt_name和其他上传规则完全不生效。 - 错误捕获缺失:没判断
do_upload()的返回结果,根本不知道视频上传失败的具体原因——是文件超了PHP限制?目录没权限?还是类型不匹配? - 文件判断逻辑不准确:用
$_FILES['xxx']['tmp_name'] !== NULL判断文件是否上传不可靠,应该用$_FILES['xxx']['error'] === 0来确认文件是否成功提交。
修复后的完整代码
// 用错误码判断文件是否成功上传,比tmp_name更可靠 $imageError = $_FILES['imagearchiev']['error']; $videoError = $_FILES['videoarchiev']['error']; if ($imageError === 0 && $videoError === 0) { // 图片上传流程 $config['upload_path'] = realpath('assets/image/icon/'); $config['allowed_types'] = 'gif|jpg|png|jpeg'; $config['max_size'] = 2000; $config['encrypt_name'] = true; $this->load->library('upload', $config); if ($this->upload->do_upload('imagearchiev')) { $data_upload = $this->upload->data(); $imagearchiev = $data_upload['file_name']; } else { // 记录图片上传错误,方便排查 log_message('error', '图片上传失败: ' . $this->upload->display_errors()); redirect('admin/addarchievement?error=image_upload'); } // 视频上传流程:必须重新初始化上传配置,不能重复加载库 $config2['upload_path'] = realpath('assets/image/icon/'); // 建议改成视频专属目录,比如assets/video/ $config2['allowed_types'] = 'mp4'; // 不用区分大小写,框架会自动处理 $config2['max_size'] = 20000000; // 注意PHP配置要支持这个大小 $config2['encrypt_name'] = true; // 关键:用initialize重置配置,而不是重新加载库 $this->upload->initialize($config2); if ($this->upload->do_upload('videoarchiev')) { $data_upload2 = $this->upload->data(); $videoarchiev = $data_upload2['file_name']; } else { // 记录视频上传错误 log_message('error', '视频上传失败: ' . $this->upload->display_errors()); redirect('admin/addarchievement?error=video_upload'); } $titlearchiev = $this->input->post('titlearchiev'); $textarchiev = $this->input->post('summernote'); // 这里记得添加数据入库的逻辑(原代码里没写) redirect('admin/addarchievement?success=1'); } else { // 处理文件未选中或上传失败的情况 redirect('admin/addarchievement?error=file_not_selected'); }
额外必查项
- PHP配置调整:确保php.ini里的
upload_max_filesize、post_max_size要大于你设置的20000000字节(约19M),比如设为upload_max_filesize = 20M,post_max_size = 25M(后者必须比前者大);max_execution_time也要适当调大,避免上传大文件超时。 - 目录权限:上传目录要给服务器写入权限,一般设为755,部分环境可能需要777(根据服务器配置调整)。
- 日志开启:打开Codeigniter的日志功能,能直接看到上传失败的具体报错,比瞎猜高效太多。
内容的提问来源于stack exchange,提问作者daun babadotan
相关产品推荐
相关产品推荐

