使图像和视频上传可选

时间:2012-09-07 09:46:21

标签: php codeigniter file-upload controller

我在codeigniter中有一个小应用程序。有一个表单有3个文本字段,名称,电子邮件,位置。这足以提交。但是,有两个可选字段供所有用户提交图像或视频或两者。我一直在工作,直到上传文件出错。当我希望它停止整个提交直到错误得到修复时,它仍然会提交文本数据。

这是我的控制器的代码。任何帮助都会很棒。谢谢!

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Form extends MY_Controller {

public function __construct()
{
    parent::__construct();
    $this->load->helper(array('form', 'url'));
}

function index()
    {
        $this->load->helper(array('form', 'url'));

        $this->load->library('form_validation');

        $this->form_validation->set_rules('nominee', 'Nominee', 'required');
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('location', 'Location', 'required');

        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('form');
        }
        else
        {
             // Load the library - no config specified here
                $this->load->library('upload');

                // Check if there was a file uploaded - there are other ways to
                // check this such as checking the 'error' for the file - if error
                // is 0, you are good to code
                if (!empty($_FILES['imageupload']['name']))
                {
                    // Specify configuration for File 1
                    $config['upload_path'] = 'uploads/images';
                    $config['allowed_types'] = 'gif|jpg|png';
                    $config['max_size'] = '100';
                    $config['max_width']  = '1024';
                    $config['max_height']  = '768';       

                    // Initialize config for File 1
                    $this->upload->initialize($config);

                    // Upload file 1
                    if ($this->upload->do_upload('imageupload'))
                    {
                        $data = $this->upload->data();
                    }
                    else
                    {
                        echo $this->upload->display_errors();
                    }

                }

                // Do we have a second file?
                if (!empty($_FILES['videoupload']['name']))
                {
                    // Config for File 2 - can be completely different to file 1's config
                    // or if you want to stick with config for file 1, do nothing!
                    $config['upload_path'] = 'uploads/videos/';
                    $config['allowed_types'] = 'gif|jpg|png';
                    $config['max_size'] = '100';
                    $config['max_width']  = '1024';
                    $config['max_height']  = '768';

                    // Initialize the new config
                    $this->upload->initialize($config);

                    // Upload the second file
                    if ($this->upload->do_upload('videoupload'))
                    {
                        $data = $this->upload->data();
                    }
                    else
                    {
                        echo $this->upload->display_errors();
                    }

                }

            $this->load->view('thankyou');
            //Run code to add into the database
        }
    }

}

1 个答案:

答案 0 :(得分:0)

将所有上传数据逻辑放入custom validation callback

然后,如果验证失败(包括上传),页面将返回到表单,并预先填写数据 - 您的用户可以修复文件上传。

然后你的控制器逻辑也被简化了;

    $this->load->library('form_validation');

    $this->form_validation->set_rules('nominee', 'Nominee', 'required');
    $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
    $this->form_validation->set_rules('location', 'Location', 'required');
    $this->form_validation->set_rules('imageupload', 'Image Upload', 'callback__image_upload');
    $this->form_validation->set_rules('videoupload', 'Video Upload', 'callback__video_upload');

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('form');
    }
    else
    {
        //Run code to add into the database
        $this->load->view('thankyou');
    }

function _video_upload()
{
   //put upload logic here and check if its valid
}

function _image_upload()
{
   //put upload logic here and check if its valid
}