CodeIgniter 2多文件上传自定义文件名设置失效问题求助
CodeIgniter 2 多文件上传自定义文件名不生效问题
我在使用CodeIgniter 2实现多文件上传功能时,上传功能可正常运行,但自定义文件名设置始终不生效,尝试多次修改仍无法解决问题。相关代码如下:
function do_upload($last_insert_id) { $files = $_FILES; $cpt = count($_FILES['userfile']['name']); $file_name_array=array(); for($i=0; $i<=$cpt; $i++) { $config = array(); if($files['userfile']['size'][$i] > 0 ) { $image_name = "ledger_".$last_insert_id."_".$i; $config['upload_path'] ='./uploads/ledger/'; $config['allowed_types'] = 'gif|jpg|png|jpeg|pdf|doc|docx|xsl|xlsx|xslx|csv|xls'; $config['max_size'] = '0'; $config['overwrite'] = FALSE; $config['file_name'] = $image_name; $this->load->library('upload', $config); $_FILES['userfile']['name']= $files['userfile']['name'][$i]; $_FILES['userfile']['type']= $files['userfile']['type'][$i]; $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i]; $_FILES['userfile']['error']= $files['userfile']['error'][$i]; $_FILES['userfile']['size']= $files['userfile']['size'][$i]; // $this->upload->initialize($this->set_upload_options()); //$this->upload->do_upload(); if($this->upload->do_upload()) { echo $image_name; array_push($file_name_array,$image_name); } else { $empty_file=''; array_push($file_name_array,$empty_file); } } } echo "<pre>"; print_r( $file_name_array); }
问题分析与解决方案
核心问题
你代码里的几个关键错误导致自定义文件名失效:
- 循环边界错误:
for($i=0; $i<=$cpt; $i++)应该改成$i<$cpt,数组索引从0开始,count()返回元素个数,当i等于cpt时会访问超出数组范围的元素,引发逻辑混乱。 - 库加载与初始化顺序错误:先加载upload库并传入config,之后才修改
$_FILES数组,导致file_name设置未与当前上传文件关联。正确顺序是先重置$_FILES,再初始化配置。 - 缺少文件扩展名处理:
$config['file_name']仅设置文件名主体,未保留原文件扩展名,CodeIgniter不会自动添加,导致上传文件无后缀,且可能影响格式校验。
修正后的代码
function do_upload($last_insert_id) { $files = $_FILES; $cpt = count($_FILES['userfile']['name']); $file_name_array = array(); // 循环外加载upload库,避免重复加载 $this->load->library('upload'); for($i=0; $i<$cpt; $i++) // 修正循环边界 { // 仅处理上传成功的文件 if($files['userfile']['size'][$i] > 0 && $files['userfile']['error'][$i] == UPLOAD_ERR_OK) { // 获取原文件扩展名 $ext = pathinfo($files['userfile']['name'][$i], PATHINFO_EXTENSION); $image_name = "ledger_".$last_insert_id."_".$i.".".$ext; $config = array( 'upload_path' => './uploads/ledger/', 'allowed_types' => 'gif|jpg|png|jpeg|pdf|doc|docx|xls|xlsx|csv', // 移除重复格式 'max_size' => 0, 'overwrite' => FALSE, 'file_name' => $image_name ); // 重置当前文件的$_FILES数据 $_FILES['userfile']['name'] = $files['userfile']['name'][$i]; $_FILES['userfile']['type'] = $files['userfile']['type'][$i]; $_FILES['userfile']['tmp_name'] = $files['userfile']['tmp_name'][$i]; $_FILES['userfile']['error'] = $files['userfile']['error'][$i]; $_FILES['userfile']['size'] = $files['userfile']['size'][$i]; // 重新初始化上传配置 $this->upload->initialize($config); if($this->upload->do_upload()) { array_push($file_name_array, $image_name); } else { array_push($file_name_array, ''); } } else { array_push($file_name_array, ''); } } echo "<pre>"; print_r($file_name_array); }
关键修改说明
- 循环边界修正:确保遍历有效文件索引,避免越界访问。
- 初始化顺序调整:先重置
$_FILES再初始化配置,保证自定义文件名与当前文件绑定。 - 保留文件扩展名:使用
pathinfo()获取原扩展名,保证上传文件格式正确。 - 增加错误判断:仅处理上传状态正常的文件,避免无效操作。
- 优化库加载:循环外加载upload库,提升性能。
内容的提问来源于stack exchange,提问作者John Ken
相关产品推荐
相关产品推荐

