Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/04/2014, 22:48
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: subir varios archivos en un form con php

La subida de archivos se realiza con un elemento de entrada (input) de tipo file y con la función move_uploaded_file, la cual se encarga de subir el archivo al servidor. Al mismo tiempo, guardarías mediante una sentencia SQL, el nombre del archivo subido para acceder a él en un futuro a través de dicho nombre.

Código HTML:
Ver original
  1. <form action = "upload.php" method = "post" enctype = "multipart/form-data">
  2.     <input type = "file" name = "imagen1" />
  3.     <input type = "file" name = "imagen2" />
  4.     <input type = "file" name = "imagen3" />
  5.     <input type = "file" name = "imagen4" />
  6.     <input type = "submit" value = "Subir" />
  7. </form>

Código PHP:
Ver original
  1. $tipos = array("image/jpg", "image/jpeg", "image/png", "image/gif", "image/bmp");
  2. $i = 0;
  3.  
  4. foreach ($_FILES as $imagen){
  5.     if ($imagen["error"] == UPLOAD_ERR_OK and in_array($imagen["type"], $tipos)){
  6.         if (++$i == 1)
  7.             $nombre = $id . ".jpg";
  8.         else
  9.             $nombre = $id . "-0" . $i . ".jpg";
  10.  
  11.         $temporal = $imagen["tmp_name"];
  12.         $carpeta = "../imagenes/";
  13.         move_uploaded_file($temporal, $carpeta . $nombre);
  14.        
  15.         $query = mysqli_query($conexion, "INSERT INTO tabla (id_imagen, imagen) VALUES ($id, $nombre)");
  16.     }
  17.     else
  18.         echo "Se produjo un error al intentar subir el archivo";
  19. }

Lo que hago es simple. En el primer archivo, tengo un formulario con 4 elementos <input> de tipo file. Luego de seleccionar las imágenes deseadas, las envío a un archivo PHP que las subirá al servidor y guardarás sus nombres en la BD. En dicho archivo, tengo un array que contiene los tipos de archivo que admitiré en mi subida, que como verás, son los tipos más comunes de imagen. Además, tengo un contador $i que iniciará con el valor -1 y que será con el que sabré si estoy en la primera iteración o en una superior, por el tema de que quieres que la estructura del nombre de la primera imagen sea distinta al del resto.

El array multidimensional $_FILES es el que contiene a los archivos subidos; es multidimensional pues contiene un array por cada archivo, en donde las claves o índices de dichos arrays son name (nombre del archivo), tmp_name (nombre temporal del archivo), type (tipo del archivo), error (código de error, aquí puedes ver todos los códigos) y size (tamaño del archivo). Dado que $_FILES es un array, procedo a recorrerlo con un bucle ya que el proceso será el mismo para todos los archivos subidos. En cada iteración, la variable $imagen tomará a cada uno de los arrays contenidos en $_FILES, es decir, los arrays que contienen la información de cada archivo subido.

Ya estando en el bucle, compruebo que no se haya producido un error al momento de recibir el archivo desde el formulario y que el tipo del archivo corresponda con alguno de los que contiene el array $tipos, en caso de ser así, verifico el valor del contador, si éste aumentado en uno es igual a cero, es decir, es la primera imagen, le asigno como nombre el valor del $id del usuario o registro y lo concateno con el tipo de imagen que en este caso será JPG, caso contrario, le doy la forma que indicas, es decir, el valor del $id, seguido de un guión y el valor del contador y concatenado con el tipo de imagen.

Enseguida, asigno el nombre temporal del archivo a la variable $temporal y predetermino el valor de la variable $carpeta que será la ruta de la carpeta en la que se guardarán los archivos. Con la función move_uploaded_file, subo el archivo a la carpeta indicada en el servidor y más abajo, guardo el nombre del archivo en la tabla de la BD.

Te sugiero que uses comillas simples en lugar de las dobles que uso en este ejemplo, lo hice por el tema del resaltado del color del texto para que se vea más claro, pero por temas de eficiencia, es mejor utilizar comillas simples para texto simple (sin variables PHP ni etiquetas HTML).

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand