Múltiplos arquivos de upload (Array) com o CodeIgniter 2.0

Eu tenho procurado e lutando por 3 dias agora para fazer isso funcionar, mas eu simplesmente não posso. O que eu quero fazer é usar um formulário de input de vários arquivos e enviá-los. Não posso usar apenas um número fixo de arquivo para fazer upload. Eu tentei muitas soluções no StackOverflow, mas não consegui encontrar uma solução funcional.

Aqui está o meu controlador de upload

load->helper(array('form', 'url','html')); } function index() { $this->load->view('pages/uploadform', array('error' => ' ' )); } function do_upload() { $config['upload_path'] = './Images/'; $config['allowed_types'] = 'gif|jpg|png'; $this->load->library('upload'); foreach($_FILES['userfile'] as $key => $value) { if( ! empty($key['name'])) { $this->upload->initialize($config); if ( ! $this->upload->do_upload($key)) { $error['error'] = $this->upload->display_errors(); $this->load->view('pages/uploadform', $error); } else { $data[$key] = array('upload_data' => $this->upload->data()); $this->load->view('pages/uploadsuccess', $data[$key]); } } } } } ?> 

Meu formulário de upload é This.

    Upload Form      

Eu continuo tendo este erro:

Você não selecionou um arquivo para upload.

Aqui está a matriz do exemplo:

Array ([userfile] => Array ([nome] => Array ([0] => youtube.png [1] => zergling.jpg) [tipo] => Array ([0] => imagem / png [1 ] => imagem / jpeg) [tmp_name] => Array ([0] => E: \ wamp \ tmp \ php7AC2.tmp [1] => E: \ wamp \ tmp \ php7AC3.tmp) [erro] => Array ([0] => 0 [1] => 0) [tamanho] => Array ([0] => 35266 [1] => 186448)))

Eu tenho isso como 5 vezes seguidas, se eu selecionar 2 arquivos. Eu também uso a biblioteca de upload padrão.

Eu finalmente consegui fazer isso funcionar com a sua ajuda!

Aqui está meu código:

  function do_upload() { $this->load->library('upload'); $files = $_FILES; $cpt = count($_FILES['userfile']['name']); for($i=0; $i< $cpt; $i++) { $_FILES['userfile']['name']= $files['userfile']['name'][$i]; $_FILES['userfile']['type']= $files['userfile']['type'][$i]; $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i]; $_FILES['userfile']['error']= $files['userfile']['error'][$i]; $_FILES['userfile']['size']= $files['userfile']['size'][$i]; $this->upload->initialize($this->set_upload_options()); $this->upload->do_upload(); } } private function set_upload_options() { //upload an image options $config = array(); $config['upload_path'] = './Images/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '0'; $config['overwrite'] = FALSE; return $config; } 

Obrigado pessoal!

Você deve usar esta biblioteca para multi upload no CI https://github.com/stvnthomas/CodeIgniter-Multi-Upload

Instalação Basta copiar o arquivo MY_Upload.php para o diretório da biblioteca de aplicativos.

Use: function test_up no controlador

 public function test_up(){ if($this->input->post('submit')){ $path = './public/test_upload/'; $this->load->library('upload'); $this->upload->initialize(array( "upload_path"=>$path, "allowed_types"=>"*" )); if($this->upload->do_multi_upload("myfile")){ echo '
'; print_r($this->upload->get_multi_upload_data()); echo '

'; } }else{ $this->load->view('test/upload_view'); }

}

upload_view.php na pasta applications / view / test

 

Tente este código.

Está funcionando bem para mim

Você deve inicializar cada vez que a biblioteca

  function do_upload() { foreach ($_FILES as $index => $value) { if ($value['name'] != '') { $this->load->library('upload'); $this->upload->initialize($this->set_upload_options()); //upload the image if ( ! $this->upload->do_upload($index)) { $error['upload_error'] = $this->upload->display_errors("", ""); //load the view and the layout $this->load->view('pages/uploadform', $error); return FALSE; } else { $data[$key] = array('upload_data' => $this->upload->data()); $this->load->view('pages/uploadsuccess', $data[$key]); } } } } private function set_upload_options() { //upload an image options $config = array(); $config['upload_path'] = 'your upload path'; $config['allowed_types'] = 'gif|jpg|png'; return $config; } 

Editar mais

Eu encontrei o caminho que você deve fazer upload de seus arquivos com uma checkbox de input única

O CodeIgniter não suporta múltiplos arquivos. Usando o do_upload () em um foreach não será diferente de usá-lo fora.

Você precisará lidar com isso sem a ajuda do CodeIgniter. Aqui está um exemplo https://github.com/woxxy/FoOlSlide/blob/master/application/controllers/admin/series.php#L331-370

https://stackoverflow.com/a/9846065/1171049

Isso é o que você disse nos comentários 🙂

outro pedaço de código aqui:

consulte: https://github.com/stvnthomas/CodeIgniter-Multi-Upload

Como Carlos Rincones sugeriu; não tenha medo de brincar com superglobais.

 $files = $_FILES; for($i=0; $i$v ) { $_FILES['userfile'][$k] = $v[$i]; } $this->upload->do_upload('userfile') } 
  public function imageupload() { $count = count($_FILES['userfile']['size']); $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'gif|jpg|png|bmp'; $config['max_size'] = '0'; $config['max_width'] = '0'; $config['max_height'] = '0'; $config['image_library'] = 'gd2'; $config['create_thumb'] = TRUE; $config['maintain_ratio'] = FALSE; $config['width'] = 50; $config['height'] = 50; foreach($_FILES as $key=>$value) { for($s=0; $s< =$count-1; $s++) { $_FILES['userfile']['name']=$value['name'][$s]; $_FILES['userfile']['type'] = $value['type'][$s]; $_FILES['userfile']['tmp_name'] = $value['tmp_name'][$s]; $_FILES['userfile']['error'] = $value['error'][$s]; $_FILES['userfile']['size'] = $value['size'][$s]; $this->load->library('upload', $config); if ($this->upload->do_upload('userfile')) { $data['userfile'][$i] = $this->upload->data(); $full_path = $data['userfile']['full_path']; $config['source_image'] = $full_path; $config['new_image'] = './uploads/resiezedImage'; $this->load->library('image_lib', $config); $this->image_lib->resize(); $this->image_lib->clear(); } else { $data['upload_errors'][$i] = $this->upload->display_errors(); } } } } 

Eu usei abaixo do código na minha biblioteca personalizada
chamar isso do meu controlador como abaixo,

 function __construct() {
    parent::__construct();
    $this->load->library('CommonMethods');
}
$config = array();
$config['upload_path'] = 'assets/upload/images/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_width'] = 150;
$config['max_height'] = 150;
$config['encrypt_name'] = TRUE;
$config['overwrite'] = FALSE;
// upload multiplefiles
$fileUploadResponse = $this->commonmethods->do_upload_multiple_files('profile_picture', $config);

 /** * do_upload_multiple_files - Multiple Methods * @param type $fieldName * @param type $options * @return type */ public function do_upload_multiple_files($fieldName, $options) { $response = array(); $files = $_FILES; $cpt = count($_FILES[$fieldName]['name']); for($i=0; $i< $cpt; $i++) { $_FILES[$fieldName]['name']= $files[$fieldName]['name'][$i]; $_FILES[$fieldName]['type']= $files[$fieldName]['type'][$i]; $_FILES[$fieldName]['tmp_name']= $files[$fieldName]['tmp_name'][$i]; $_FILES[$fieldName]['error']= $files[$fieldName]['error'][$i]; $_FILES[$fieldName]['size']= $files[$fieldName]['size'][$i]; $this->CI->load->library('upload'); $this->CI->upload->initialize($options); //upload the image if (!$this->CI->upload->do_upload($fieldName)) { $response['erros'][] = $this->CI->upload->display_errors(); } else { $response['result'][] = $this->CI->upload->data(); } } return $response; } 
 

MODELO: FilesUpload

 class FilesUpload extends CI_Model { public function setFiles() { $name_array = array(); $count = count($_FILES['userfile']['size']); foreach ($_FILES as $key => $value) for ($s = 0; $s < = $count - 1; $s++) { $_FILES['userfile']['name'] = $value['name'][$s]; $_FILES['userfile']['type'] = $value['type'][$s]; $_FILES['userfile']['tmp_name'] = $value['tmp_name'][$s]; $_FILES['userfile']['error'] = $value['error'][$s]; $_FILES['userfile']['size'] = $value['size'][$s]; $config['upload_path'] = 'assets/product/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '10000000'; $config['max_width'] = '51024'; $config['max_height'] = '5768'; $this->load->library('upload', $config); if (!$this->upload->do_upload()) { $data_error = array('msg' => $this->upload->display_errors()); var_dump($data_error); } else { $data = $this->upload->data(); } $name_array[] = $data['file_name']; } $names = implode(',', $name_array); return $names; } } 

CONTROLADOR enviar

 class Submit extends CI_Controller { function __construct() { parent::__construct(); $this->load->helper(array('html', 'url')); } public function index() { $this->load->model('FilesUpload'); $data = $this->FilesUpload->setFiles(); echo '
'; print_r($data); } }

  // Change $_FILES to new vars and loop them foreach($_FILES['files'] as $key=>$val) { $i = 1; foreach($val as $v) { $field_name = "file_".$i; $_FILES[$field_name][$key] = $v; $i++; } } // Unset the useless one ;) unset($_FILES['files']); // Put each errors and upload data to an array $error = array(); $success = array(); // main action to upload each file foreach($_FILES as $field_name => $file) { if ( ! $this->upload->do_upload($field_name)) { echo ' failed '; }else{ echo ' success '; } } 

Todos os arquivos Postados serão disponibilizados na variável $ _FILES, para usar a biblioteca de upload codeigniter nós precisamos dar o field_name que estamos usando para upload (por padrão será ‘userfile’), então nós obtemos todo arquivo postado e criamos outro array de arquivos que criam o nosso próprio nome para cada arquivo e dão esse nome à function do_upload da biblioteca codeigniter.

 if(!empty($_FILES)){ $j = 1; foreach($_FILES as $filekey=>$fileattachments){ foreach($fileattachments as $key=>$val){ if(is_array($val)){ $i = 1; foreach($val as $v){ $field_name = "multiple_".$filekey."_".$i; $_FILES[$field_name][$key] = $v; $i++; } }else{ $field_name = "single_".$filekey."_".$j; $_FILES[$field_name] = $fileattachments; $j++; break; } } // Unset the useless one unset($_FILES[$filekey]); } foreach($_FILES as $field_name => $file){ if(isset($file['error']) && $file['error']==0){ $config['upload_path'] = [upload_path]; $config['allowed_types'] = [allowed_types]; $config['max_size'] = 100; $config['max_width'] = 1024; $config['max_height'] = 768; $this->load->library('upload', $config); $this->upload->initialize($config); if ( ! $this->upload->do_upload($field_name)){ $error = array('error' => $this->upload->display_errors()); echo "Error Message : ". $error['error']; }else{ $data = $this->upload->data(); echo "Uploaded FileName : ".$data['file_name']; // Code for insert into database } } } } 
 function UploadHotelImage(){ $data = array(); if($this->input->post('fileSubmit') && !empty($_FILES['userFiles']['name'])){ $filesCount = count($_FILES['userFiles']['name']); for($i = 0; $i < $filesCount; $i++){ $_FILES['userFile']['name'] = $_FILES['userFiles']['name'][$i]; $_FILES['userFile']['type'] = $_FILES['userFiles']['type'][$i]; $_FILES['userFile']['tmp_name'] = $_FILES['userFiles']['tmp_name'][$i]; $_FILES['userFile']['error'] = $_FILES['userFiles']['error'][$i]; $_FILES['userFile']['size'] = $_FILES['userFiles']['size'][$i]; $uploadPath = 'uploads/files/'; $config['upload_path'] = $uploadPath; $config['allowed_types'] = 'gif|jpg|png'; $this->load->library('upload', $config); $this->upload->initialize($config); if($this->upload->do_upload('userFile')){ $fileData = $this->upload->data(); $uploadData[$i]['file_name'] = $fileData['file_name']; $uploadData[$i]['created'] = date("Ymd H:i:s"); $uploadData[$i]['modified'] = date("Ymd H:i:s"); } } if(!empty($uploadData)){ //Insert file information into the database $insert = $this->file->insert($uploadData); $statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.'; $this->session->set_flashdata('statusMsg',$statusMsg); } } //Get files data from database $data['files'] = $this->file->getRows(); //Pass the files data to view $this->load->view('upload_files/index', $data); } } //----- Model-----------// public function insertHotelImage($data = array()){ $insert = $this->db->insert_batch('tbl_hotel_images',$data); return $insert?true:false; } 

Use este código para upload de várias imagens no CI ….

 function imageUpload(){ if ($this->input->post('submitImg') && !empty($_FILES['files']['name'])) { $filesCount = count($_FILES['files']['name']); $userID = $this->session->userdata('userID'); $this->load->library('upload'); $config['upload_path'] = './userdp/'; $config['allowed_types'] = 'jpg|png|jpeg'; $config['max_size'] = '9184928'; $config['max_width'] = '5000'; $config['max_height'] = '5000'; $files = $_FILES; $cpt = count($_FILES['files']['name']); for($i = 0 ; $i < $cpt ; $i++){ $_FILES['files']['name']= $files['files']['name'][$i]; $_FILES['files']['type']= $files['files']['type'][$i]; $_FILES['files']['tmp_name']= $files['files']['tmp_name'][$i]; $_FILES['files']['error']= $files['files']['error'][$i]; $_FILES['files']['size']= $files['files']['size'][$i]; $imageName = 'image_'.$userID.'_'.rand().'.png'; $config['file_name'] = $imageName; $this->upload->initialize($config); if($this->upload->do_upload('files')){ $fileData = $this->upload->data(); //it return $uploadData[$i]['picturePath'] = $fileData['file_name']; } } if (!empty($uploadData)) { $imgInsert = $this->insert_model->insertImg($uploadData); $statusMsg = $imgInsert?'Files uploaded successfully.':'Some problem occurred, please try again.'; $this->session->set_flashdata('statusMsg',$statusMsg); redirect('home/user_dash'); } } else{ redirect('home/user_dash'); } } 

Não há nenhum método predefinido disponível no codeigniter para fazer upload de vários arquivos de uma só vez, mas você pode enviar o arquivo em array e enviá-los um por um

aqui é referir: Aqui é a melhor opção para fazer upload de vários arquivos no codeigniter 3.0.1 com visualização https://codeaskbuzz.com/how-to-upload-multiple-file-in-codeigniter-framework/

Eu recentemente trabalhei nisso. Experimente esta function:

 /** * @return array an array of your files uploaded. */ private function _upload_files($field='userfile'){ $files = array(); foreach( $_FILES[$field] as $key => $all ) foreach( $all as $i => $val ) $files[$i][$key] = $val; $files_uploaded = array(); for ($i=0; $i < count($files); $i++) { $_FILES[$field] = $files[$i]; if ($this->upload->do_upload($field)) $files_uploaded[$i] = $this->upload->data($files); else $files_uploaded[$i] = null; } return $files_uploaded; } 

no seu caso:

  

ou

    

no controlador:

 public function do_upload(){ $config['upload_path'] = './Images/'; $config['allowed_types'] = 'gif|jpg|png'; //... $this->load->library('upload',$config); if ($_FILES['images']) { $images= $this->_upload_files('images'); print_r($images); } } 

Alguma referência básica do manual PHP : upload do arquivo PHP

Salve e redefina a variável $ _FILES para o que precisar. talvez não a melhor solução, mas isso funcionou para mim.

 function do_upload() { $this->load->library('upload'); $this->upload->initialize($this->set_upload_options()); $quantFiles = count($_FILES['userfile']['name']); for($i = 0; $i < $quantFiles ; $i++) { $arquivo[$i] = array ( 'userfile' => array ( 'name' => $_FILES['userfile']['name'][$i], 'type' => $_FILES['userfile']['type'][$i], 'tmp_name' => $_FILES['userfile']['tmp_name'][$i], 'error' => $_FILES['userfile']['error'][$i], 'size' => $_FILES['userfile']['size'][$i] ) ); } for($i = 0; $i < $quantFiles ; $i++) { $_FILES = ''; $_FILES = $arquivo[$i]; if ( ! $this->upload->do_upload()) { $error[$i] = array('error' => $this->upload->display_errors()); return FALSE; } else { $data[$i] = array('upload_data' => $this->upload->data()); var_dump($this->upload->data()); } } if(isset($error)) { $this->index($error); } else { $this->index($data); } 

}

a function separada para estabelecer a configuração ..

 private function set_upload_options() { $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'xml|pdf'; $config['max_size'] = '10000'; return $config; }