php - multiples - multiupload codeigniter
La carga mĂșltiple de archivos de CodeIgniter no funciona (3)
Prueba así,
function upload_files()
{
$config = array();
$config[''upload_path''] = ''./Images/'';
$config[''allowed_types''] = ''gif|jpg|png'';
$config[''max_size''] = ''0'';
$config[''overwrite''] = FALSE;
$this->load->library(''upload'');
$files = $_FILES;
for($i=0; $i< count($_FILES[''userfile''][''name'']); $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($config);
$this->upload->do_upload();
}
}
Intento cargar varios archivos en una carpeta, pero aparece el error "No seleccionó un archivo para cargar".
Se ha encontrado un error PHP
Gravedad: advertencia
Mensaje: is_uploaded_file () espera que el parámetro 1 sea string, array dado
Nombre de archivo: libraries / Upload.php
Número de línea: 412
Backtrace:
Archivo: C: / wamp / www / mshaadi / application / controllers / Email.php Línea: 55 Función: do_upload
Archivo: C: / wamp / www / mshaadi / index.php Línea: 293 Función: require_once
Controlador
$conf[''upload_path''] = ''./images'';
$conf[''allowed_types''] = ''doc|docx|pdf|jpg|gif|jpeg|png'';
$conf[''max_size''] = ''9999000'';
$conf[''max_width''] = ''1024'';
$conf[''max_height''] = ''768'';
$conf[''overwrite''] = TRUE;
$this->load->library(''upload'');
foreach ($_FILES as $fieldname => $fileObject){
$this->upload->initialize($conf);
if (!empty($fileObject[''name''])){
if (!$this->upload->do_upload($fieldname)){
$error = $this->upload->display_errors();
print_r($error);
}else{
print_r("done");
}
}else {
print_r("no");
}
}
ver
<div class="form-group col-md-12">
<label for="Attach"><strong>Add Attachment</strong><br></label>
<input type="file" class="btn btn-default btn-file" name="atta[]" id="Attach" multiple="multiple">
</div>
esto esta funcionando
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;
}
Voy a agregar mi respuesta como una explicación más completa a la respuesta de @ SachinMarwa. El código que presento no es un código diferente, sino que agrega algunas líneas y detalles que no se mencionan en su respuesta.
Aunque parece que su respuesta es técnicamente correcta, y tal vez las respuestas sobre las suyas también son correctas a su manera, no funcionaron para mí. Tuve que estudiar este problema para descubrir qué está pasando realmente, y aprendí lo suficiente sobre el proceso para comprender cómo escribir mi propia solución.
Antes que nada, consulte el comentario de Nana Partykar, "¿En su controlador, no puedo ver ninguna función is_uploaded_file ()?" Ese comentario nos dice que las personas están malinterpretando los dos archivos que tienen nombres similares, pero son diferentes. Lo sé, porque durante un tiempo pensé que debían referirse al mismo archivo, el archivo del controlador (llamado "Uploader.php"). Puedo ver que casi todas estas preguntas se refieren al mismo tutorial "Cómo cargar varios archivos usando Ajax" en algún lugar, mi propia versión, incluida. El código que todos estamos usando es exactamente el mismo.
Pero, el archivo del controlador es "Uploader.php". Donde vea $ this-> upload-> do_upload () o $ this-> upload-> do_upload (''userfile'') o incluso $ this-> upload-> do_upload (''files''), esto se refiere a un sistema / archivo del módulo de biblioteca llamado "Upload.php". Tenga en cuenta que antes de llamar a la función do_upload (), debe invocar esta línea: $ this-> load-> library (''upload'', $ config);
Sachin Marwha nos dio un bucle for que recorre la matriz $ _FILES [''userfile'']. Digamos que cargas tres imágenes. Cada elemento $ _FILES [''userfile''] está compuesto de 5 "propiedades": nombre, tipo, tmp_name, error, tamaño. Puede ver estas propiedades de $ _FILE en PHP .
Solo desea pasar un archivo a la vez a do_upload (). No desea pasar los tres (o incluso 20) archivos a la vez para hacer_subir. Esto significa que debe descomponer la matriz $ _FILES [''userfile''] en archivos individuales antes de llamar a do_upload (). Para hacer esto, hago un elemento $ _FILES [''f''] de la matriz $ _FILES. Me di cuenta estableciendo puntos de interrupción en el archivo system / library / Upload.php, en la función do_upload ($ file = ''userfile''), para ver dónde estaba obteniendo el infame "no seleccioné un archivo para cargar" que todo el mundo (incluido yo mismo) sigue quejándose. Esa función, encontrará, usa la matriz $ _FILES original que su formulario envía a su controlador. Pero realmente solo usa el nombre del tipo de entrada = archivo de tu formulario. Si no le dice el nombre de la entrada del formulario, tendrá como valor predeterminado $ _FILES [''userfile'']. Resultó que ese era mi mayor problema, porque si usaba el nombre de mi campo de entrada, bueno, ese campo pasa una matriz o una colección de archivos, no solo un archivo. Así que tuve que hacer un elemento $ _FILES [''f] especial, y SOLAMENTE pasar $ _FILES ['' f ''].
Así es como lo estoy haciendo, y créanme, probé todas las versiones en esta página y otras, no solo una , sino también otros tutoriales:
$cpt = count($_FILES[''userfile''][''name'']);
for($i=0; $i < $cpt; $i++)
{
unset($config);
$config = array();
$config[''upload_path''] = $path;
$config[''allowed_types''] = ''gif|jpg|png'';
$config[''max_size''] = ''1000'';
$config[''overwrite''] = TRUE;
$config[''remove_spaces''] = FALSE;
$config[''file_name''] = $_FILES[''userfile''][''name''][$i];
// Create a new ''f'' element of the $_FILES object, and assign the name, type, tmp_name, error, and size properties to the corresponding ''userfile'' of this iteration of the FOR loop.
$_FILES[''f''][''name''] = $_FILES[''userfile''][''name''][$i];
$_FILES[''f''][''type''] = $_FILES[''userfile''][''type''][$i];
$_FILES[''f''][''tmp_name''] = $_FILES[''userfile''][''tmp_name''][$i];
$_FILES[''f''][''error''] = $_FILES[''userfile''][''error''][$i];
$_FILES[''f''][''size''] = $_FILES[''userfile''][''size''][$i];
$this->load->library(''upload'', $config);
$this->upload->initialize($config);
if (! $this->upload->do_upload(''f''))
{
$data[''errors''] = $this->upload->display_errors();
}
else
{
$data[''errors''] = "SUCCESS";
}
unset($config);
$config = array();
$config[''image_library''] = ''gd2'';
$config[''source_image''] = $path . $_FILES[''userfile''][''name''][$i];
$config[''create_thumb''] = TRUE;
$config[''maintain_ratio''] = TRUE;
$config[''thumb_marker''] = ''.thumb'';
$config[''width''] = 100;
$config[''height''] = 100;
$this->load->library(''image_lib'', $config);
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
$types = array(''.jpg'');
}
Donde desata la matriz $ config dentro del bucle for i, y luego rehace la matriz $ config, esa es la parte que crea las imágenes en miniatura para cada archivo de imagen.
La función de carga completa del controlador:
public function upload_asset_photo()
{
$data = array();
$dateArray = explode("/",$this->input->post(''date''));
$date = $dateArray[2] . "/" . $dateArray[0] . "/" . $dateArray[1]; // year/month/day
$cid = $this->config->item(''cid''); // this is a special company id I use, unnecessary to you guys.
$padded_as_id = sprintf("%010d", $this->uri->segment(3)); // this makes an "asset id" like "3" into "0000000003"
$path = ''properties_/'' . $padded_as_id . ''/'' . $date . ''/''; // file path
if (!is_dir($path)) {
mkdir($path,0755,true); //makes the ile path, if it doesn''t exist
}
$cpt = count($_FILES[''userfile''][''name'']);
for($i=0; $i < $cpt; $i++)
{
unset($config);
$config = array();
$config[''upload_path''] = $path;
$config[''allowed_types''] = ''gif|jpg|png'';
$config[''max_size''] = ''1000'';
$config[''overwrite''] = TRUE;
$config[''remove_spaces''] = FALSE;
$config[''file_name''] = $_FILES[''userfile''][''name''][$i];
$_FILES[''f''][''name''] = $_FILES[''userfile''][''name''][$i];
$_FILES[''f''][''type''] = $_FILES[''userfile''][''type''][$i];
$_FILES[''f''][''tmp_name''] = $_FILES[''userfile''][''tmp_name''][$i];
$_FILES[''f''][''error''] = $_FILES[''userfile''][''error''][$i];
$_FILES[''f''][''size''] = $_FILES[''userfile''][''size''][$i];
$this->load->library(''upload'', $config);
$this->upload->initialize($config);
if (! $this->upload->do_upload(''f''))
{
$data[''errors''] = $this->upload->display_errors();
}
else
{
$data[''errors''] = "SUCCESS";
}
unset($config);
$config = array();
$config[''image_library''] = ''gd2'';
$config[''source_image''] = $path . $_FILES[''userfile''][''name''][$i];
$config[''create_thumb''] = TRUE;
$config[''maintain_ratio''] = TRUE;
$config[''thumb_marker''] = ''.thumb'';
$config[''width''] = 100;
$config[''height''] = 100;
$this->load->library(''image_lib'', $config);
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
$types = array(''.jpg'');
}
header(''Content-Type: application/json'');
echo json_encode($data);
}