CodeIgniter多独立文件上传字段仅第一个生效问题求解
问题原因
- CodeIgniter框架的类加载器默认采用单例模式,首次调用
$this->load->library('upload', $config)加载上传类之后,后续再执行相同的加载语句不会重新实例化上传类,也不会自动覆盖已加载的配置项。你第二个字段定义的$config2配置完全没有生效,上传逻辑一直复用第一次的配置,所以会出现文件名始终读取第一个配置、甚至第二个文件上传被忽略的问题。 - 你之前尝试unset
$config变量的操作无效,是因为你清理的只是本地的配置变量,已经注入到上传类实例中的配置没有被修改,自然不会生效。
解决方法
方法1:复用上传实例,每次上传前重新初始化配置(官方推荐)
不需要重复加载上传库,仅加载一次,每次处理不同上传字段前,调用initialize()方法用新配置重置上传类即可:
// 全局只加载一次上传类 $this->load->library('upload'); // 处理第一个字段aadhar_image if (!empty($_FILES['aadhar_image']['name'])) { $config['upload_path'] = "./public/images/user/"; $config['allowed_types'] = "gif|jpg|png|jpeg|pdf|docx|dotx"; $config['overwrite'] = TRUE; $aadhar_image = date('hisdmy').rand(); $config['file_name'] = $aadhar_image; // 初始化配置 $this->upload->initialize($config); $this->upload->do_upload('aadhar_image'); } // 处理第二个字段pan_image if (!empty($_FILES['pan_image']['name'])) { $config2['upload_path'] = "./public/images/user/"; $config2['allowed_types'] = "gif|jpg|png|jpeg|pdf|docx|dotx"; $config2['overwrite'] = TRUE; $pan_image = date('hisdmy').rand(); $config2['file_name'] = $pan_image; // 用新配置重新初始化上传类 $this->upload->initialize($config2); $this->upload->do_upload('pan_image'); }
该方案资源占用更低,是多文件上传场景的常用实现方式。
方法2:给每个上传实例指定独立别名,避免单例复用
如果需要多个上传实例完全隔离,可以在加载上传类时传入第三个参数指定对象别名,每个上传字段对应独立的上传类实例:
// 处理第一个字段,指定实例别名为upload_aadhar if (!empty($_FILES['aadhar_image']['name'])) { $config['upload_path'] = "./public/images/user/"; $config['allowed_types'] = "gif|jpg|png|jpeg|pdf|docx|dotx"; $config['overwrite'] = TRUE; $aadhar_image = date('hisdmy').rand(); $config['file_name'] = $aadhar_image; $this->load->library('upload', $config, 'upload_aadhar'); $this->upload_aadhar->do_upload('aadhar_image'); } // 处理第二个字段,指定实例别名为upload_pan if (!empty($_FILES['pan_image']['name'])) { $config2['upload_path'] = "./public/images/user/"; $config2['allowed_types'] = "gif|jpg|png|jpeg|pdf|docx|dotx"; $config2['overwrite'] = TRUE; $pan_image = date('hisdmy').rand(); $config2['file_name'] = $pan_image; $this->load->library('upload', $config2, 'upload_pan'); $this->upload_pan->do_upload('pan_image'); }
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

