2011-12-04 22 views
15

En mi proyecto CodeIgniter, estoy cargando archivos durante la creación del proyecto. Aquí está la función de carga:Cargar archivos múltiples en 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; } 

} 

Y llamar a esta función en la función create_project así:

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(); 
    } 
} 

Sin embargo, esto no hace nada. Los archivos no se están cargando. Incluso un directorio vacío no se está creando. ¿Alguien podría ayudarme a encontrar el error?

Gracias.

+0

página de verificación roytuts.com/codeigniter-multiple-files-upload/ – user3470953

Respuesta

20

Puede cargar cualquier número de archivos ..

$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 
     } 
    } 
} 
+1

¿Existe una configuración para la cantidad de archivos? Solo pude subir 20 con mi código codeigniter y no es muy diferente a esto. – jason

+0

+1 para '$ this-> upload-> initialize()' – Jonah

+4

Me dio error is_uploaded_file() espera que el parámetro 1 sea string, array dado, como he intentado depurar, $ fieldname es una matriz. – zoom

0

creo que se ha perdido esto:

 
$config['file_name']  = 'somename_'.$i; 
$config['upload_path'] = './uploads/'.$projectName; 
... 
+0

Gracias. Pero no ayudó. – cycero

2

Esta es una extensión de la clase CI_Upload que he modificado para cargar varios archivos, simplemente copiar este archivo a la MY_Upload.php. También hace el directorio también.

http://pastebin.com/g9J6RxW1

Entonces todo lo que tiene que hacer en la función del controlador es organizar los archivos en el una matriz, donde el nombre del campo y la clave son las claves de matriz y la configuración son los datos. En caso de que algo como esto:

$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, 
     ); 

si todas las configuraciones de archivos son los mismos simplemente hacer un bucle for para configurar esto, también se llevará a 'claves denominadas', es decir. $project_files['files']['file_key'].

luego simplemente llamar:

if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/} 
0

pareció ver a esta misma pregunta exacta aquí antes;)

Intenta dar salida a $ this->> upload- display_errors() en el que está incrementando el error $ variable. Eso te dirá exactamente qué salió mal. Mi dinero en permisos ...

0

he modificado MY_upload de cubitos de ojos para devolver la información del archivo de todos los archivos subidos. Tal como estaba, solo se podía acceder a la información del último archivo al llamar al método de datos. También agregué la dirección IP del cargador a esa lista.

http://pastebin.com/tG8A85gY

Puede ser utilizado por el siguiente texto:

$upload_files = $this->upload->upload_files($project_files); 
if ($upload_files->status == true) 
{ 
$fileInfo = $uploaded_files->file_info; 
} 

que darse cuenta de esto sería mejor como una edición de cubitos de ojos, pero este es mi primer post, no tengo reputación.

0

Por simplicidad, he creado este archivo de ayuda de CI.Puede cargarlo desde el archivo de configuración & en cualquier lugar de su proyecto.Se acaba de tomar 3 patrameters

@fileobject = nombre de objeto de archivo HTML

@fileopath = ruta del archivo que desea cargar

@filetypes = por defecto *, 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;} 

Probado & probado.

1

No puedo comentar aún debido a mi nivel de reputación, pero Zoom hizo un comentario con la respuesta aceptada acerca de que la variable $ fieldname era una matriz que causaba un error. Tuve el mismo problema con esa respuesta y descubrí que era porque había agregado todos mis nombres de entrada de archivos en el formulario con [], lo que hizo que php tomara esas entradas como una variable de matriz. Para resolver ese problema, simplemente déle a cada entrada de archivo un nombre único en lugar de convertirlo en una matriz de PHP. Después de hacerlo, el problema desapareció y la respuesta aceptada funcionó como un hechizo. Solo pensé en pasarle la información a cualquiera que se encuentre con este problema.

+0

¿Qué quiere decir darle a cada entrada de archivo un nombre único? Existe una diferencia entre usar un solo '' y usar múltiples líneas de campos de entrada. Con el campo de entrada único, puede seleccionar varios archivos desde la ventana del explorador de archivos. Con múltiples campos de entrada, solo puede elegir un archivo a la vez, y creo que eso degrada la función de selección de archivos múltiples, pero supongo que funciona. ¿Tal vez podrías explicar un poco más lo que quieres decir? – TARKUS

+0

Además, también estoy usando los archivos 'name = '[]'', así que sé a qué se dirige. En la llamada Ajax, recorro los archivos [] de esta manera: 'formData.append ('date', document.getElementById ('date'). Value); var ins = document.getElementById ('files'). Files.length; for (var x = 0; x "; print_r($_FILES); echo ""; 'Aun así, la respuesta aceptada no funciona para mí, así que sigo haciendo algo mal. : / – TARKUS

Cuestiones relacionadas