【问题标题】:Multiple image uploading error in CodeigniterCodeigniter 中的多张图片上传错误
【发布时间】:2017-05-28 13:32:31
【问题描述】:

我正在尝试通过我的表单上传多张图片。我已经处理了许多期望,例如 form_open_multipart,在上传输入中将名称称为 Array。

图片上传没有问题。我可以成功上传多张图片,但是当我选择带有图片的任何文本或非图片文件时出现问题。

我正在检查的情况是,如果用户将图像与文本文件混合(不小心选择了任何其他带有图像的文件)图像和文本文件,那么一些文件正在被上传,然后我得到错误类型的文件的错误。 在理想情况下,如果任何一个文件的文件类型不正确,它可能不允许上传文件。

那么任何人都可以帮我解决一下我如何在文件上传之前检查所有文件是否允许输入?

我尝试了很多示例,但总体上遇到了相同的问题。

如果我上传多张图片没有问题。它工作正常。

<input type="file" name="pic_url[]"  multiple accept="image/*" />

下面是我的控制器

$config['upload_path'] = './assets/prop_pic/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = 20000;
    $config['encrypt_name'] = TRUE;
    $config['detect_mime'] = TRUE;
    //initialize upload class
    $this->load->library('upload', $config);

    $upload_error = array();

    for ($i = 0; $i < count($_FILES['pic_url']['name']); $i++) {

        $_FILES['pic_url']['name'] = $_FILES['pic_url']['name'][$i];
        $_FILES['pic_url']['type'] = $_FILES['pic_url']['type'][$i];
        $_FILES['pic_url']['tmp_name'] = $_FILES['pic_url']['tmp_name'][$i];
        $_FILES['pic_url']['error'] = $_FILES['pic_url']['error'][$i];
        $_FILES['pic_url']['size'] = $_FILES['pic_url']['size'][$i];

        if (!$this->upload->do_upload('pic_url')) {
            // fail
            $upload_error = array('error' => $this->upload->display_errors());
            //$this->load->view('multiple_upload_view', $upload_error);

            $this->session->set_flashdata('upload_error', $upload_error);
            redirect('property_master/view_prop_master_form');

            break;
        }
    }

【问题讨论】:

    标签: image codeigniter file-upload


    【解决方案1】:

    第一个问题主要取决于您如何处理错误。

    if (!$this->upload->do_upload('pic_url')) {
        // fail
        $upload_error = array('error' => $this->upload->display_errors());
        //$this->load->view('multiple_upload_view', $upload_error);
    
        $this->session->set_flashdata('upload_error', $upload_error);
        redirect('property_master/view_prop_master_form');
    
        break;
    }
    

    上面的代码将简单地停止 for 循环的其余部分并在第一个错误时重定向。

    一个简单的解决方案是将其更改为记录故障并继续处理:

    $config['upload_path'] = './assets/prop_pic/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = 20000;
    $config['encrypt_name'] = TRUE;
    $config['detect_mime'] = TRUE;
    //initialize upload class
    $this->load->library('upload', $config);
    
    $upload_error = array();
    
    for ($i = 0; $i < count($_FILES['pic_url']['name']); $i++) {
    
        $_FILES['pic_url']['name'] = $_FILES['pic_url']['name'][$i];
        $_FILES['pic_url']['type'] = $_FILES['pic_url']['type'][$i];
        $_FILES['pic_url']['tmp_name'] = $_FILES['pic_url']['tmp_name'][$i];
        $_FILES['pic_url']['error'] = $_FILES['pic_url']['error'][$i];
        $_FILES['pic_url']['size'] = $_FILES['pic_url']['size'][$i];
    
        if (!$this->upload->do_upload('pic_url')) {
            $upload_error[$i] = array('error' => $this->upload->display_errors());
        }
    }
    
    if (!empty($upload_error)) {
        $this->session->set_flashdata('upload_error', $upload_error);
        redirect('property_master/view_prop_master_form');
    }
    

    或者,您需要根据文件扩展名手动验证文件。

    $config['upload_path'] = './assets/prop_pic/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = 20000;
    $config['encrypt_name'] = TRUE;
    $config['detect_mime'] = TRUE;
    //initialize upload class
    $this->load->library('upload', $config);
    
    $upload_error = array();
    
    foreach ($_FILES['pic_url'] as $key => $file) {
    
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        if (strpos($config['allowed_types'], $ext) === false) {
            $upload_error[$key] => array('error' => sprintf('<p>Invalid file extension (%s)</p>', $ext));
            continue;
        }
    
        $_FILES['userfile'] = $file;
        $this->upload->initialize($config);
    
        if (!$this->upload->do_upload('userfile')) {
            $upload_error[$key] = array('error' => $this->upload->display_errors());
        } else {
            // do something with $this->upload->data();
        }
    }
    
    if (!empty($upload_error)) {
        $this->session->set_flashdata('upload_error', $upload_error);
        redirect('property_master/view_prop_master_form');
    }
    

    希望有帮助

    【讨论】:

    • 感谢您的建议和帮助先生。我肯定将此解决方案应用于我的代码。再次感谢并非常感谢您的支持。
    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2021-09-04
    • 2017-04-08
    • 2011-12-10
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多