Ошибка проверки загрузки ФАЙЛА Codeigniter - PullRequest
1 голос
/ 21 ноября 2010

Мое приложение успешно использует проверку Codeigniter в нескольких контроллерах для различных полей ввода. Но когда дело доходит до загрузки и проверки загруженного изображения, проверка жалуется.

У меня есть следующая форма: require_once ( 'head.php'); echo '

Обновление аватара

'; если (validation_errors ()) echo '' .validation_errors (). '';
if($info)
    echo '<div class="info">'.$info.'</div>';

$attributes = array('class' => 'updateavatarform', 'id' => 'updateavatarform');
echo form_open_multipart('user/avatar', $attributes);

echo '<div>Select Image</div>';
$data = array(
        'name'        => 'avatar',
        'id'          => 'avatar',
        'value'       => '',
        'maxlength'   => '',
        'size'        => '48',
      );
echo form_upload($data);

echo '<br/><br/>';
echo form_submit('submit', 'Submit');
echo form_close();
require_once('footer.php');

Контроллер выглядит так:

function avatar()
{
    $data['user'] = $this->authorize->isLoggedIn();
    if(!$data['user'])
        $this->authorize->protectUser();

    $data['title'] = 'Evcenter User Update Avatar';
    $data['keywords'] = 'alternative fuel';
    $data['description'] = 'evcenter.org';
    $data['info'] = FALSE;

    if($_POST)
    {
            $this->load->model('User_model', '', TRUE);

            $this->load->library('form_validation');
            $input['avatar'] = trim($this->input->post('avatar', TRUE));
            $this->form_validation->set_rules('avatar', 'Avatar', 'trim|required|xss_clean');

            if($this->form_validation->run() == FALSE)
            {
                $this->load->view('avatar', $data);
            }
            else
            {
                $avatar = $this->User_model->getAvatar($data['user']['user_id']);
                $old_avatar = $this->config->item('avatarpath').$avatar['avatar'];
                unset($old_avatar);
                $input['avatar'] = $this->uploadAvatar();
                $input['id'] = $data['user']['user_id'];
                $this->User_model->updateAvatar($input);

                $data['info'] = 'Your avatar has been updated';
                $this->load->view('avatar', $data);
            }
    }
    else
    {
        $this->load->view('avatar', $data);
    }
}

В результате проверки возникает следующая ошибка с загруженным изображением или без него: «Поле аватара обязательно». Само собой разумеется, $ this-> uploadAvatar (); работает при вызове из контроллера регистра.

Кто-нибудь может увидеть, что не так? Нужно ли проверять загружаемые файлы иначе, чем ввод текста?

Ответы [ 2 ]

5 голосов
/ 21 ноября 2010

Правильно, файлы должны проверяться иначе, чем текстовые вводы - как они есть, а не текстовые вводы!

Из документов:

function do_upload()
{
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = '100';
    $config['max_width']  = '1024';
    $config['max_height']  = '768';

    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload())
    {
        $error = array('error' => $this->upload->display_errors());

        $this->load->view('upload_form', $error);
    }   
    else
    {
        $data = array('upload_data' => $this->upload->data());

        $this->load->view('upload_success', $data);
    }
}   

обратите внимание на вызов $this->upload->do_upload() и$this->upload->display_errors()

Загрузка в CI с текстовыми полями может раздражать (imo), я сначала загрузил бы файл в ваш контроллер, затем, если он был успешным, выполнил остальные данные POST и обновил вашу базу данных.

Таким образом, если позже возникнет проблема с загрузкой, у вас не будет недействительных записей.

2 голосов
/ 15 августа 2013

* Предполагается, что у вас уже есть библиотека MY_Form_Validation, которая расширяет встроенный компонент CodeIgniter. *

Первый

Я добавил несколько функций для проверки частей загрузки $ _FILE, основываясь на этом:

http://devbro.com/testing/ci_form_validation/

Я просто скопировал функции, а не весь файл. Мне не нужны пользовательские методы run или execute. Просто методы проверки. (У меня уже есть настройка, которая позволяет мне смешивать файл конфигурации form_validation И правила контроллера вместе.)

/**
* tests to see if a required file is uploaded
* 
* @param mixed $file
*/
function file_required($file)
{
    if($file['size']===0)
    {
        $this->CI->form_validation->set_message('file_required','Uploading a file for %s is required.');
        return FALSE;
    }
    return TRUE;
}


/**
* tests the file extension for valid file types
* 
* @param mixed $file
* @param mixed $type
*/
function file_allowed_type($file,$type)
{
    //is type of format a,b,c,d? -> convert to array
    $exts = explode(',',$type);   
    //is $type array? run self recursively
    if(count($exts)>1)
    {
        foreach($exts as $v)
        {
            $rc = $this->file_allowed_type($file,$v);
            if($rc===TRUE)
            {
                return TRUE;
            }
        }
    }

    //is type a group type? image, application, word_document, code, zip .... -> load proper array
    $ext_groups = array();
    $ext_groups['image'] = array('jpg','jpeg','gif','png');
    $ext_groups['application'] = array('exe','dll','so','cgi');
    $ext_groups['php_code'] = array('php','php4','php5','inc','phtml');
    $ext_groups['word_document'] = array('rtf','doc','docx');
    $ext_groups['compressed'] = array('zip','gzip','tar','gz');
    $ext_groups['pdf'] = array('pdf');

    if(array_key_exists($exts[0],$ext_groups))
    {
        $exts = $ext_groups[$exts[0]];
    }

    //get file ext
    $file_ext = strtolower(strrchr($file['name'],'.'));
    $file_ext = substr($file_ext,1);

    if(!in_array($file_ext,$exts))
    {
        $this->CI->form_validation->set_message('file_allowed_type',"%s should be $type.");
        return false;        
    }
    else
    {
        return TRUE;
    }
}

и т. Д. И т. П.

Тогда

Я добавил нужные правила в свой конфигурационный файл form_validation.php, но трактую свой FILE , как будто он включен в $ _ POST Конечно, нет, но я исправлю это через мгновение. НЕ использовать другие типы проверок, встроенные в CodeIgniter, используйте только проверки FILE!

$config = array(

            'form/index' => array(
                array( 'field'=>'my_upload_file', 'label'=>'File To Upload', 'rules'=>'file_required|file_allowed_type[pdf]'),
                ...

Наконец

В моем контроллере добавьте $ _FILE ['my_upload_file'] в массив $ _POST

if ( isset($_FILES['my_upload_file']) )
{
     $_POST['my_upload_file'] = $_FILES['my_upload_file'];
}

Я думаю, что большое предостережение заключается в том, что вы используете $ _POST для заполнения своих моделей или других действий. Мои проекты кода специально выбирают элементы из input-> post (), и я не использую массовые присваивания для чего-либо. Если вы используете массовое задание, я предполагаю, что вы ошиблись в своих предположениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...