You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:01:43