* Предполагается, что у вас уже есть библиотека 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 (), и я не использую массовые присваивания для чего-либо. Если вы используете массовое задание, я предполагаю, что вы ошиблись в своих предположениях.