Ver Mensaje Individual
  #8 (permalink)  
Antiguo 08/02/2012, 12:22
Avatar de luis_h_1
luis_h_1
 
Fecha de Ingreso: octubre-2010
Ubicación: México
Mensajes: 42
Antigüedad: 14 años, 2 meses
Puntos: 4
Respuesta: Subir una cantidad limitada de imágenes al servidor y guardar las URLs en

En uno de mis proyectos hice algo parecido, te cuento: era un sistema para noticias en la que cada noticia tenia un conjunto de 4 o menos imágenes y cada imagen tenia una breve descripción, utilcé 3 tablas para poder tener una relación entre la noticia e imágenes para cada una.


Primero te muestro el javascript que use(no recuerdo donde me lo encontre xD, pero aquí va)

Código Javascript:
Ver original
  1. var numero = 0;
  2. var num = 1;
  3. var limite = <?php if (isset ($limite)){echo $limite;}else{echo "4";}?>;
  4. // Funciones comunes
  5. c= function (tag) { // Crea un elemento
  6.    return document.createElement(tag);
  7. }
  8. d = function (id) { // Retorna un elemento en base al id
  9.    return document.getElementById(id);
  10. }
  11. e = function (evt) { // Retorna el evento
  12.    return (!evt) ? event : evt;
  13. }
  14. f = function (evt) { // Retorna el objeto que genera el evento
  15.    return evt.srcElement ?  evt.srcElement : evt.target;
  16. }
  17.  
  18. addField = function () {  
  19.    if(num <= limite){
  20.    container = d('files');
  21.    
  22.    
  23.    span = c('SPAN');
  24.    span.className = 'file';
  25.    span.id = 'file' + (++numero);
  26.  
  27.    field = c('INPUT');  
  28.    field.name = 'archivos[]';
  29.    field.type = 'file';
  30.    
  31.    field2 = c('INPUT');  
  32.    field2.name = 'descripcion[]';
  33.    field2.type = 'text';
  34.    field2.size = '40';
  35.    field2.value = 'Inserte una breve descripción';
  36.    
  37.    a = c('A');
  38.    a.name = span.id;
  39.    a.href = '#';
  40.    a.onclick = removeField;
  41.    a.innerHTML = 'Quitar';
  42.  
  43.    span.appendChild(field);
  44.    span.appendChild(field2);
  45.    span.appendChild(a);
  46.    container.appendChild(span);
  47.    num++;
  48.    
  49.    }  
  50. }
  51. removeField = function (evt) {
  52.     num--;
  53.    lnk = f(e(evt));
  54.    span = d(lnk.name);
  55.    span.parentNode.removeChild(span);
  56. }

La variable $limite tiene como valor el resultado de una consulta a la tabla donde se relacionan las noticias con las imágenes, si no tenia ninguna imagen cargada entonces el limite es 4

Luego el formulario para subir multiples imágenes

Código PHP:
Ver original
  1. <form name="formulario" id="formulario" action="procesa_alta_img.php" method="post" enctype="multipart/form-data">
  2.    <input type="hidden" value="alta_img" name="alta_img" />
  3.    <?php
  4.        $id_noticia = $_POST['id_noticia'];
  5.        echo "<input type='hidden' value='".$id_noticia."' name='id_noticia' />";
  6.     ?>
  7.         <label>Selecciona:</label>
  8.         <dd><div id="files"></div><div id="comentario"></div></dd>
  9.         <dt>&nbsp;&nbsp;&nbsp;<a href="#" onclick="addField()">A&ntilde;adir Archivo</a></dt>
  10.         <dd><input type="Submit" value="Cargar" /></dd>
  11.    </dl>
  12.            
  13. </form>

$id_noticia es el id que se genera automáticamente y lo envio en un campo oculto

y para procesar el upload de imágenes procesa_alta_img.php


Código PHP:
Ver original
  1. <?php
  2. include('conexion.php');
  3. if (isset($_FILES["archivos"])) {
  4.          //de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
  5.          //obtenemos la cantidad de elementos que tiene el arreglo archivos
  6.          $errores = 0;
  7.          $name=array();
  8.          $tot = count($_FILES["archivos"]["name"]);
  9.          //este for recorre el arreglo
  10.          for ($i = 0; $i < $tot; $i++){
  11.          //con el indice $i, podemos obtener la propiedad que desemos de cada archivo
  12.          //para trabajar con este
  13.          //verificamos los campos vacios en este if
  14.             if(!empty($_FILES['archivos']['name'][$i])){
  15.                 //vemos dimensiones de imagenes para aceptarla o no
  16.                 $img = $_FILES['archivos']['name'][$i]; // almaceno el nombre del archivo subido
  17.                 $tipo = $_FILES['archivos']['type'][$i];  // almaceno el tipo de archivo                   
  18.                 $anchomin = 400;
  19.                 $imagen = $_FILES['archivos']['tmp_name'][$i];
  20.                 $descripcion = $_POST['descripcion'][$i];
  21.                 //aca controlo que el archivo subido sea JPG
  22.                 if ($tipo == "image/jpeg" || $tipo == "image/jpg" || $tipo == "image/pjpeg" || $tipo == "image/png") {
  23.                 switch($tipo){
  24.                         case 'image/jpeg':    $ext = "jpg"; break;
  25.                         case 'image/jpg':     $ext = "jpg"; break;
  26.                         case 'image/pjpeg':     $ext = "jpg"; break;
  27.                         case 'image/png':     $ext = "jpg"; break;
  28.                         default:        $ext = "jpg"; break;
  29.                 }              
  30.                 $img2 = date("mdy")."_".date("His")."_1_".rand(100,9999).".".$ext; //nombre de la nueva imagen achicada
  31.                 // es JPG o PNG entonces abtengo el tamaño en pixel de la imagen subida
  32.                 $tamanos = getimagesize($imagen);
  33.                 $ancho = $tamanos[0];
  34.                 $alto =  $tamanos[1];
  35.                 $aspecto = $alto/$ancho;
  36.                 // controlo que mida de ancho mas que  el limite
  37.                 if ($ancho >= $anchomin) {
  38.                     //agui separo los 3 tamanos de imagen
  39.                     for($t=0; $t<=2; $t++){
  40.                     //defino los 3 directorios
  41.                     $dir = "imagenes_noticias/".$anchomin."/";
  42.                     $nuevoalto = round($anchomin / $ancho * $alto); //calculo el nuevo alto
  43.                     //tomamos la imagen de la original con un switch
  44.                     switch($tipo)
  45.                         {
  46.                         case 'jpeg':    $imagenoriginal = ImageCreateFromJPEG($imagen); break;
  47.                         case 'jpg':     $imagenoriginal = ImageCreateFromJPEG($imagen); break;
  48.                         case 'png':     $imagenoriginal = ImageCreateFromPNG($imagen); break;                      
  49.                         default:        $imagenoriginal = ImageCreateFromJPEG($imagen); break;
  50.                     }                  
  51.                     $imagennueva = imagecreatetruecolor($anchomin,$nuevoalto); // creo el lienzo de la imagen nueva
  52.                     imagecopyresampled($imagennueva, $imagenoriginal, 0, 0, 0, 0, $anchomin, $nuevoalto, $ancho, $alto);// cambio el tanaño
  53.                     imagejpeg($imagennueva, $dir . $img2); // guardo el archivo nuevo
  54.                     $archivo = $dir.$img2;
  55.                     $sql="INSERT INTO imagen_noticia(
  56.                                     id_noticia,nombre,ruta,dimension,descripcion
  57.                                     ) VALUES(
  58.                                     '".$_POST['id_noticia']."','".$img2."','".$archivo."','".$anchomin."','".$descripcion."')";
  59.                     mysql_query($sql,$conexion) or die("Error en la insercion".mysql_error($conexion));
  60.  
  61.                     if($t == 1){
  62.                         $anchomin = 100;
  63.                     }else{
  64.                         $anchomin = $anchomin / 2;
  65.                     }
  66.                     }//for($t=0; $t<=2; $t++)                  
  67.                 }//if ($ancho > $anchomin)
  68.                 else {
  69.                     $name[$errores] = "<b>".$_FILES["archivos"]["name"][$i]." </b><font color='red'>No cumple con las dimensiones requeridas.</font>";
  70.                     $errores++;
  71.                     //echo "<font color='red'>Las dimensiones deben de ser minimo de 800px de ancho</font>";
  72.                  };
  73.                 }//if ($tipo == "image/jpeg" || $tipo == "image/jpg" || $tipo == "image/png")
  74.                 else {
  75.                     $name[$errores] = "<b>".$_FILES["archivos"]["name"][$i]." </b><font color='red'>No tiene extención JPG.</font>";
  76.                     $errores++;
  77.                 //$muestra = "<font color='red'>No tiene extención JPG.</font>";
  78.                 //echo $muestra;
  79.                 }
  80.             }//if(!empty($_FILES['archivos']['name'][$i]))
  81.                 else{
  82.                     $campo = $i + 1;
  83.                     $name[$errores] = "<font color='red'>El campo ".$campo." se envio vacio.</font>";
  84.                     $errores++;                
  85.             }
  86.         }//for ($i = 0; $i < $tot; $i++)
  87.         /*
  88.         $celdas = 3;
  89.         $dato = $i / $celdas;
  90.         $u_fila = floor($dato);
  91.         $in=0;
  92.         echo "<table border='0'>";
  93.         for($fila=0; $fila<=$u_fila; $fila++){
  94.             echo "<tr>";
  95.             for($cuenta=1; $cuenta<=$celdas; $cuenta++){
  96.                 echo "<td align='center'>";
  97.                 echo "<img src='".$direccion[$in]."'>";
  98.                 echo "</td>";
  99.                 $in++;
  100.             }
  101.             echo "</tr>";
  102.         }
  103.         echo "</table>";
  104.         */
  105.        
  106.       }//if (isset ($_FILES["archivos"]))  
  107. mysql_close($conexion);
  108. function array_envia($array) {
  109.  
  110.      $tmp = serialize($array);
  111.      $tmp = urlencode($tmp);
  112.  
  113.      return $tmp;
  114. }
  115. $arreglo = array_envia($name);
  116. $id_noticia = $_POST['id_noticia'];

En este momento ya me tengo que ir, pero alguna duda la comentas y más alrato lo veo, espero te sirva o te oriente con tu proyecto, saludos.