【问题标题】:Multiple files uploading not working in Codeigniter多个文件上传在 Codeigniter 中不起作用
【发布时间】:2015-07-24 11:53:20
【问题描述】:

在 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);
                            }
                          }
                        }
                    }
                }
            }

而我的view页面代码是这样的。

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

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

【问题讨论】:

  • 更改此if ($this-&gt;upload-&gt;do_upload('med_file[]')) { 并尝试
  • @Saty。试过这样。不工作
  • 您错过了表单中的操作属性。

标签: php codeigniter file-upload


【解决方案1】:

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

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

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

第 2 步:检索文件并取消设置原始 $_FILES 以便您可以重建数组:

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

第三步:遍历获取的文件,将$_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");
        }

    }
}

【讨论】:

  • 感谢@CodeGodie 的良好解释。我了解您的解决方案,它的工作方式就像一个魅力!我在我的代码中给出了表单操作。抱歉,我没有在帖子中更新。我想知道我的代码哪里出错了
  • 不客气。错误正如我所指出的那样;发送到上传库的 $_FILES 设置不正确,重命名是在发送破坏它的配置之前完成的。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 2015-09-26
  • 2013-03-17
  • 2013-12-09
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多