上传的多个文件无法在Codeigniter中使用

时间:2015-07-24 11:53:20

标签: php codeigniter file-upload

在codeigniter上传多个文件时,我收到错误 ,就像这样,

  

致命错误:... / system \ libraries \ Upload.php

中不支持的操作数类型
if(isset($_FILES['med_file']))
            {
                $config['upload_path'] = './medical_history_doc/';
                $config['allowed_types'] = 'jpg|jpeg|png|doc|docx|pdf|txt';
                $this->load->library('upload', $config);

                $files = $_FILES;
                $cpt = count($_FILES['med_file']['name']);

                for($i=0; $i<$cpt; $i++)
                {
                    if($files['med_file']['name'][$i] !="")
                    {

                        $_FILES['med_file']['name']= $files['med_file']['name'][$i];
                        $_FILES['med_file']['type']= $files['med_file']['type'][$i];
                        $_FILES['med_file']['tmp_name']= $files['med_file']['tmp_name'][$i];

                        $attachment_name=$files['med_file']['name'][$i];
                        $path_info=pathinfo($attachment_name);
                        $file_extension=@$path_info['extension'];
                        $path_part_filename=$path_info['filename'];
                        $rename_file=str_replace(" ","",$path_part_filename).'_'.date('Ymdhis');

                        if(!empty($rename_file))
                        {

                            $_FILES['med_file']['name'] = $rename_file.'.'.$file_extension;
                            $medical_history_files[]=$rename_file.'.'.$file_extension;
                            if($this->upload->do_upload('med_file'))
                            {
                                $file_upload='true';

                            }
                            else if(!$this->upload->do_upload('med_file'))
                            {
                                $file_upload="fail";
                                $error= $this->upload->display_errors();

                                $this->session->set_flashdata('sucess', $error);
                            }
                          }
                        }
                    }
                }
            }

和我的查看页面代码是这样的。

<form method="post" name="medicalhistory" id="medicalhistory"
            enctype="multipart/form-data">
<input id="med_file" type="file" name="med_file[]" multiple>
</form>

请帮我解决这个问题。感谢

1 个答案:

答案 0 :(得分:2)

你在这里错过了几件事。首先,你的HTML form应该有一个属性action指向你的控制器方法。其次,$_FILES数组应始终包含以下内容:name, type, tmp_name, error, size但是,在循环中,您只能使用name, type, tmp_name,进行重建,而您却忘记了其他数据。您还在将文件发送到上载库之前重命名该文件。您应该通过在发送到库的config数组中进行设置来完成此操作。我会以下列方式重做代码:

第1步:确保HTML表单具有操作属性:

<form action="<?= base_url()?>controller/upload" ..

第2步:检索文件并取消设置原始$ _FILES,以便重建阵列:

$uploaded_files = $_FILES['med_file'];
unset($_FILES);

第3步:遍历获取的文件并将$ _FILES数组重建为多维数组:

foreach ($uploaded_files as $desc => $arr) {
    foreach ($arr as $k => $string) {
        $_FILES[$k][$desc] = $string;
    }
}

第4步:加载上传库,然后设置配置选项

$this->load->library('upload');
$config['upload_path'] = './medical_history_doc/';
$config['allowed_types'] = 'jpg|jpeg|png|doc|docx|pdf|txt';

步骤5:循环遍历新的$ _FILES数组,重命名您的文件并将config['filename']设置为新名称。初始化您的上传,然后运行它:

foreach ($_FILES as $k => $file) {
    $path_info = pathinfo($file["name"]);
    $file_extension = $path_info['extension'];
    $path_part_filename = $path_info['filename'];
    $config['file_name'] = str_replace(" ", "", $path_part_filename) . '_' . date('Ymdhis') . '.' . $file_extension;

    $this->upload->initialize($config);

    if (!$this->upload->do_upload($k)) {
        $errors = $this->upload->display_errors();
        var_dump($errors);
    } else {
        var_dump("success");
    }

}

最终结果

查看

<form action="<?= base_url()?>controller/upload" method="post" id="medicalhistory" enctype="multipart/form-data">
    <input id="med_file" type="file" name="med_file[]" multiple>
    <input type="submit">
</form>

<强>控制器:

public function upload() {
    $uploaded_files = $_FILES['med_file'];
    unset($_FILES);

    foreach ($uploaded_files as $desc => $arr) {
        foreach ($arr as $k => $string) {
            $_FILES[$k][$desc] = $string;
        }
    }

    $this->load->library('upload');
    $config['upload_path'] = './medical_history_doc/';
    $config['allowed_types'] = 'jpg|jpeg|png|doc|docx|pdf|txt';

    foreach ($_FILES as $k => $file) {
        $path_info = pathinfo($file["name"]);
        $file_extension = $path_info['extension'];
        $path_part_filename = $path_info['filename'];
        $config['file_name'] = str_replace(" ", "", $path_part_filename) . '_' . date('Ymdhis') . '.' . $file_extension;

        $this->upload->initialize($config);

        if (!$this->upload->do_upload($k)) {
            $errors = $this->upload->display_errors();
            var_dump($errors);
        } else {
            var_dump("success");
        }

    }
}