多图片上传异常求助:仅单张图片存入数据库,求排查代码问题
解决CodeIgniter多图上传仅存单张的问题
兄弟,太懂这种赶功能还卡壳的疲惫了!咱们来把你这个多图上传的问题捋明白~
首先看你贴的代码片段,核心问题有几个:你只给$_FILES赋值了name和type,但漏掉了**tmp_name和error**这两个上传必须的字段;另外CodeIgniter的Upload库每次用之前都得重新初始化,不然会复用之前的配置导致上传覆盖或者失败。
下面是修正后的完整控制器代码,我给你加了注释,你可以直接参考:
public function blog_img() { $this->load->library('upload'); // 先配置上传参数,根据你的实际需求调整路径、允许类型这些 $upload_config = array( 'upload_path' => './uploads/blog_images/', // 务必确保这个目录存在且服务器有写入权限! 'allowed_types' => 'gif|jpg|png|jpeg', 'max_size' => 2048, // 单位KB,这里是2MB 'encrypt_name' => TRUE, // 自动生成随机文件名,避免重名覆盖 ); // 先把原始的文件数组存起来,避免循环里被覆盖 $all_files = $_FILES['userfile']; $file_count = count($all_files['name']); $success_uploads = array(); // 用来存所有上传成功的图片信息 // 循环处理每一张图片 for ($i = 0; $i < $file_count; $i++) { // 先跳过上传出错的文件(比如用户没选的空文件) if ($all_files['error'][$i] !== 0) { continue; } // 重新构建单文件的$_FILES数组,这一步一定要把所有字段都补上! $_FILES['userfile']['name'] = $all_files['name'][$i]; $_FILES['userfile']['type'] = $all_files['type'][$i]; $_FILES['userfile']['tmp_name'] = $all_files['tmp_name'][$i]; $_FILES['userfile']['error'] = $all_files['error'][$i]; $_FILES['userfile']['size'] = $all_files['size'][$i]; // 关键!每次循环都要重新初始化Upload库,不然会复用之前的状态 $this->upload->initialize($upload_config); // 执行上传 if ($this->upload->do_upload('userfile')) { // 拿到上传后的文件详情,比如文件名、路径 $file_info = $this->upload->data(); // 把文件名(或者完整路径)存到数组里,后面要存数据库 $success_uploads[] = $file_info['file_name']; } else { // 可以记录上传错误,方便调试 $upload_error = $this->upload->display_errors(); log_message('error', '第'.($i+1).'张图片上传失败:'.$upload_error); } } // 现在把所有成功上传的图片存入数据库 if (!empty($success_uploads)) { // 这里要注意,你需要拿到对应的博客ID(比如从表单隐藏域或者URL参数获取) $target_blog_id = $this->input->post('blog_id'); // 加载你的模型,调用存图片的方法 $this->load->model('Blog_model'); // 假设你的模型方法是save_blog_images,接收博客ID和图片数组 $this->Blog_model->save_blog_images($target_blog_id, $success_uploads); // 上传成功后的提示,比如用flashdata $this->session->set_flashdata('success_msg', '所有图片上传完成!'); redirect('blog/edit/'.$target_blog_id); } else { $this->session->set_flashdata('error_msg', '没有成功上传的图片,请检查文件后重试!'); redirect('blog/edit'); } }
另外还要提醒你前端表单的关键设置,不然多图上传根本触发不了:
<form method="POST" action="<?php echo site_url('blog/blog_img'); ?>" enctype="multipart/form-data"> <!-- 必须加[]表示多文件,还要加multiple属性 --> <input type="file" name="userfile[]" multiple class="form-control"> <!-- 隐藏域传对应的博客ID,方便存数据库关联 --> <input type="hidden" name="blog_id" value="<?php echo $your_blog_id; ?>"> <button type="submit" class="btn btn-primary">上传图片</button> </form>
最后再给你划几个重点:
- 确保上传目录存在且有写入权限,不然会直接上传失败
- 每次循环必须重新初始化Upload库,这是CodeIgniter多图上传的坑点
- 一定要处理上传错误,避免因为某一张图片出错导致整个流程卡壳
内容的提问来源于stack exchange,提问作者Shah Abbas
相关产品推荐
相关产品推荐

