PHP Codeigniter上载类,使用特定模式重命名文件

PHP Codeigniter上载类,使用特定模式重命名文件,php,codeigniter,upload,Php,Codeigniter,Upload,我在使用Codeigniter时遇到了一些问题,并且在上传过程中从它提供的上传库中获取要重命名的文件。在别人说之前,我不是在寻找“加密”的文件名 我的问题是在上传图像时,你可能会遇到很多类型的图像。那么,如何使用file\u nameconfig选项将文件名更改为特定的模式(我已经启动了模式部分并正在运行)。但是要保持相同的文件类型吗 现在我正在尝试 $upload\u config['file\u name']=$generated\u filename\u from\u schema 唯一的

我在使用Codeigniter时遇到了一些问题,并且在上传过程中从它提供的上传库中获取要重命名的文件。在别人说之前,我不是在寻找“加密”的文件名

我的问题是在上传图像时,你可能会遇到很多类型的图像。那么,如何使用
file\u name
config选项将文件名更改为特定的模式(我已经启动了模式部分并正在运行)。但是要保持相同的文件类型吗

现在我正在尝试

$upload\u config['file\u name']=$generated\u filename\u from\u schema

唯一的问题是,
$generated\u filename\u from\u schema
没有文件扩展名,而将文件扩展名排除在等式之外似乎完全忽略了它,只需获取文件并在文件具有相同名称时向上追加\u 1、\u 2、\u 3,否则它只会保持名称不变

现在,我必须将
$config
传递给CI,以便它上载文件,但在它尝试上载之前,我如何确定正在使用的文件类型,以便使用我的名称生成模式

*编辑*

    $upload_config['upload_path'] = realpath(APPPATH.'../images/');
    $upload_config['allowed_types'] = 'gif|jpg|png';
    $upload_config['max_size']  = 0;
    $upload_config['max_width'] = 0;
    $upload_config['max_height'] = 0;
    $upload_config['remove_spaces'] = true;

    $upload_config['file_name'] = $this->genfunc->genFileName($uid);

    if($this->input->post('uploads'))
    {

        $this->load->library('upload');
        $this->upload->initialize($upload_config);

        if (!$this->upload->do_upload())
        {
            //echo 'error';
            echo $config['upload_path'];
            $this->data['errors'] = $this->upload->display_errors();
        }
        else
        {
            //echo 'uploaded';
            $this->data['upload_data'] = $this->upload->data();
        }
    }

您可以使用$\u文件数组获取文件的原始名称

提取原始文件的扩展名。然后,附加到新文件名

尝试如下

$ext = end(explode(".", $_FILES[$input_file_field_name]['name']));
$upload_config['file_name'] = $this->genfunc->genFileName($uid).'.'.$ext;

就我个人而言,我觉得CodeIgniter的文件上传类有些麻烦。如果您想要一个普通的PHP解决方案:

function submit_image(){
    $f = $_FILES['image'];
    $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
    $detectedType = exif_imagetype($f['tmp_name']);
    if(in_array($detectedType, $allowedTypes)){
        $pi = pathinfo($f['name']);
        $ext = $pi['extension'];
        $target = $this->genfunc->genFileName($uid) "." . $ext;
        if(move_uploaded_file($f['tmp_name'], $target)){
            /*success*/
        }
        else {/*couldn't save the file (perhaps permission error?*/}
    }
    else {/*invalid file type*/}
}

在$config之前,我会这样做吗?所以我可以将其传递到配置中?是的,在$config之前,或者在您要调用上载函数的控制器方法开始之前,您可以为上载过程粘贴控制器方法,以便我可以建议更好的地方执行上述代码吗?添加到我的代码中,这在很大程度上是按照我希望的方式工作的。但这目前在控制器的索引函数中,其余的实际上传逻辑都包含在CI库中。如果不是为了某一天升级CI的目的,我不想编辑其中的内容。还没有,我不得不离开一会儿,我马上就要跳上我的服务器,尝试一下