Загрузите несколько файлов в CodeIgniter
В моем проекте CodeIgniter я загружаю файлы во время создания проекта. Здесь функция загрузки:
function uploadFiles(){
$this->load->library('upload');
$error = 0;
$projectName = $_POST['projectname'];
mkdir('./uploads/'.$projectName);
for($i=0; $i<count($_FILES); $i++)
{
$_FILES['userfile']['name'] = $_FILES['files']['name'][$i];
$_FILES['userfile']['type'] = $_FILES['files']['type'][$i];
$_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
$_FILES['userfile']['error'] = $_FILES['files']['error'][$i];
$_FILES['userfile']['size'] = $_FILES['files']['size'][$i];
$config['upload_path'] = './uploads/'.$projectName;
$config['allowed_types'] = 'xml|etl';
$config['max_size'] = '0';
$config['overwrite'] = TRUE;
$this->upload->initialize($config);
if($this->upload->do_upload())
{
$error += 0;
}else{
$error += 1;
}
}
if($error > 0){ return FALSE; }else{ return TRUE; }
}
И я вызываю эту функцию в функции create_project следующим образом:
public function create_project() {
$this->load->library('form_validation');
$this->form_validation->set_rules('projectname', 'Project name', 'required');
$this->form_validation->set_message('required', 'This is an obligatory field');
if($this->form_validation->run() == FALSE) {
$this->load->view('project_creation_view');
} else {
$this->load->model('Project_management_model');
$this->Project_management_model->create_project();
$this->uploadFiles();
}
}
Однако это ничего не делает. Файлы не загружаются. Даже пустой каталог не создается. Может ли кто-нибудь помочь мне найти ошибку?
Спасибо.
Ответы
Ответ 1
Вы можете загрузить любое количество файлов.
$config['upload_path'] = 'upload/Main_category_product/';
$path=$config['upload_path'];
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1024';
$config['max_width'] = '1920';
$config['max_height'] = '1280';
$this->load->library('upload', $config);
foreach ($_FILES as $fieldname => $fileObject) //fieldname is the form field name
{
if (!empty($fileObject['name']))
{
$this->upload->initialize($config);
if (!$this->upload->do_upload($fieldname))
{
$errors = $this->upload->display_errors();
flashMsg($errors);
}
else
{
// Code After Files Upload Success GOES HERE
}
}
}
Ответ 2
Это расширение класса CI_Upload, которое я модифицировал для загрузки нескольких файлов, просто скопируйте его в файл MY_Upload.php. Он также создает каталог.
http://pastebin.com/g9J6RxW1
Затем все, что вам нужно сделать в функции контроллера, - это упорядочить ваши файлы в массиве, где имя поля и ключ - это ключи массива, а config - данные. В вашем случае что-то вроде этого:
$project_files['files'][0] = array(
'upload_path' => './uploads/'.$projectName.'/',
'max_size' => 0,
'allowed_types' => 'xml|etl',
'overwrite' => TRUE,
'remove_spaces' => TRUE,
);
$project_files['files'][1] = array(
'upload_path' => './uploads/'.$projectName.'/',
'max_size' => 0,
'allowed_types' => 'xml|etl',
'overwrite' => TRUE,
'remove_spaces' => TRUE,
);
ЕСЛИ все конфиги файлов одинаковы, просто создайте цикл for, чтобы установить это, он также примет "именованные ключи", т.е. $project_files['files']['file_key']
.
то просто позвоните:
if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/}
Ответ 3
Я еще не могу прокомментировать из-за моего уровня репутации, но Zoom сделал комментарий в соответствии с принятым ответом о переменной $fieldname, являющейся массивом, вызвавшим ошибку. У меня была такая же проблема с этим ответом, и выяснилось, что это связано с тем, что я добавил все имена файлов в форме с помощью [], которые заставили php забрать эти входы в виде переменной массива. Чтобы решить эту проблему, просто дайте каждому файлу уникальное имя вместо того, чтобы сделать его массивом PHP. После того, как я это сделал, проблема ушла для меня, и принятый ответ работал как прелесть. Просто подумал, что я передам информацию всем, кто споткнется по этой проблеме.
Ответ 4
Я думаю, вы пропустили это:
$config['file_name'] = 'somename_'.$i;
$config['upload_path'] = './uploads/'.$projectName;
...
Ответ 5
Думал, что я видел здесь такой же точный вопрос раньше;)
Попробуйте вывести $this- > upload- > display_errors(), где вы увеличиваете переменную $error. Это точно скажет вам, что пошло не так. Мои деньги на разрешениях...
Ответ 6
Я изменил Cubed Eye MY_upload, чтобы вернуть информацию о файлах всех загруженных файлов. Как только это было, только последняя информация о файле была доступна при вызове метода данных. Я также добавил IP-адрес загрузчика в этот список.
http://pastebin.com/tG8A85gY
Его можно использовать следующим образом:
$upload_files = $this->upload->upload_files($project_files);
if ($upload_files->status == true)
{
$fileInfo = $uploaded_files->file_info;
}
Я понимаю, что это было бы лучше, чем редактирование Cubed Eye, но это мой первый пост, у меня нет репутации.
Ответ 7
Для простоты я создал этот вспомогательный файл CI. Вы можете загрузить его из файла конфигурации и использовать в любом месте вашего проекта. Просто возьмите 3 патруса
@fileobject = имя объекта HTML файла
@fileopath = путь к файлу, который вы хотите загрузить
@filetypes = default *, ex-jpg | png | mp4 | pdf '
function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*"){
// retrieve the number of images uploaded;
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']);
// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE.
$files = $_FILES[$fileobject];
$errors = array();
$file_arr = array();
$result = array();
// first make sure that there is no error in uploading the files
for ($k = 0; $k < $number_of_files; $k++) {
if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k];
}
if (sizeof($errors) == 0) {
// now, taking into account that there can be more than one file, for each file we will have to do the upload
// we first load the upload library
$CI =& get_instance();
$CI->load->library('upload'); // load library
// next we pass the upload path for the images
$config['upload_path'] = FCPATH . $filepath;
// also, we make sure we allow only certain type of images
$config['allowed_types'] = $filetypes;
//$config['max_size'] = (int)(ini_get('upload_max_filesize'));
$config['max_size'] = '10000';
$config['overwrite'] = FALSE;
for ($i = 0; $i < $number_of_files; $i++) {
$_FILES['uploadedimage']['name'] = $files['name'][$i];
$_FILES['uploadedimage']['type'] = $files['type'][$i];
$_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i];
$_FILES['uploadedimage']['error'] = $files['error'][$i];
$_FILES['uploadedimage']['size'] = $files['size'][$i];
//now we initialize the upload library
$CI->upload->initialize($config);
// we retrieve the number of files that were uploaded
if ($CI->upload->do_upload('uploadedimage')) {
$imageup = $CI->upload->data();
// print_r($imageup["orig_name"]);die;
array_push($file_arr, $imageup["orig_name"]);
$result["response"] = "true";
$result["message"] = "Files uploaded successfully.";
$result["files"] = $file_arr;
} else {
$result["response"] = "false";
$result["message"][$i] = $CI->upload->display_errors();
}
}
} else {
$result["response"] = "false";
$result["message"] = $errors;
}
return $result;}
Протестировано и проверено.