Foros del Web » Programando para Internet » PHP »

Ayuda para subir varias imagenes a carpeta y ruta a bd

Estas en el tema de Ayuda para subir varias imagenes a carpeta y ruta a bd en el foro de PHP en Foros del Web. Hola Gracias a este foro desarrolle alguna vez un sistema para una inmobiliaria en el que ingresaba los datos de la propiedad en la base ...
  #1 (permalink)  
Antiguo 20/09/2009, 11:09
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Ayuda para subir varias imagenes a carpeta y ruta a bd

Hola

Gracias a este foro desarrolle alguna vez un sistema para una inmobiliaria en el que ingresaba los datos de la propiedad en la base de datos a través de un formulario y luego, con otro formulario de campos FILE auto incrementables y un campo común CODIGO, varias imágenes a la base de datos como blob.

Para mostrarlas usaba primero un script sacado de aquí pata thums y listo. Todo bien hasta que apareció php5 y los nuevos parámetros. Comencé a tener problemas siempre que usaba el código y en los servidores tenían que ponerme un archivo php.ini con algunos cambios, entre ellos seguro era el register_globals en ON.

He estado documentándome y ya he visto como se trabaja ahora para register_globals OFF.

Quisiera poder modificar mis códigos para trabajar en base al nuevo "estilo" y también cambiar de subir las imágenes a BD a subirlas a carpeta con las rutas en la BD, quizás convertir a la vez en thumbs para otra carpeta o quizas convertirlas al mostra, no se.

En fin, actualizar mi sistema para trabajar actualizado y sin problemas. Para alguien como yo que ha aprendido PHP gracias a este foro y alos golpes, me queda algo dificil lograrlo solo y con la desventaja de no tener tiempo suficiente.

Quisiera en lo posible algo de ayuda para ver como hacerlo de la mejor manera.

----------------------------

la base de datos tiene 2 tablas, una PROPIEDADES con todos los datos textuales y una IMAGENES solo para las fotos con un campo común CODIGO.

El formulario para las imágenes (resumido) es con javascript:

Código HTML:
<script type="text/javascript">
var numero = 0; //Esta es una variable de control para mantener nombres
            //diferentes de cada campo creado dinamicamente.
evento = function (evt) { //esta funcion nos devuelve el tipo de evento disparado
   return (!evt) ? event : evt;
}

//Aqui se hace lamagia... jejeje, esta funcion crea dinamicamente los nuevos campos file
addCampo = function () { 
//Creamos un nuevo div para que contenga el nuevo campo
   nDiv = document.createElement('div');
//con esto se establece la clase de la div
   nDiv.className = 'archivo';
//este es el id de la div, aqui la utilidad de la variable numero
//nos permite darle un id unico
   nDiv.id = 'file' + (++numero);
//creamos el input para el formulario:
   nCampo = document.createElement('input');
//le damos un nombre, es importante que lo nombren como vector, pues todos los campos
//compartiran el nombre en un arreglo, asi es mas facil procesar posteriormente con php
   nCampo.name = 'archivo[]';
//Establecemos el tipo de campo
   nCampo.type = 'file';
//Establecemos el size de campo
   nCampo.size = '45';
//Ahora creamos un link para poder eliminar un campo que ya no deseemos
   a = document.createElement('a');
//El link debe tener el mismo nombre de la div padre, para efectos de localizarla y eliminarla
   a.name = nDiv.id;
//Este link no debe ir a ningun lado
   a.href = '#';
//Establecemos que dispare esta funcion en click
   a.onclick = elimCamp;
//Con esto ponemos el texto del link
   a.innerHTML = '&nbsp;&nbsp;Eliminar';
//Bien es el momento de integrar lo que hemos creado al documento,
//primero usamos la función appendChild para adicionar el campo file nuevo
   nDiv.appendChild(nCampo);
//Adicionamos el Link
   nDiv.appendChild(a);
//Ahora si recuerdan, en el html hay una div cuyo id es 'adjuntos', bien
//con esta función obtenemos una referencia a ella para usar de nuevo appendChild
//y adicionar la div que hemos creado, la cual contiene el campo file con su link de eliminación:
   container = document.getElementById('adjuntos');
   container.appendChild(nDiv);
}
//con esta función eliminamos el campo cuyo link de eliminación sea presionado
elimCamp = function (evt){
   evt = evento(evt);
   nCampo = rObj(evt);
   div = document.getElementById(nCampo.name);
   div.parentNode.removeChild(div);
}
//con esta función recuperamos una instancia del objeto que disparo el evento
rObj = function (evt) { 
   return evt.srcElement ?  evt.srcElement : evt.target;
}
</script>

<input name="codigo" type="text" id="codigo" size="10" />
<input name="archivo[]" type="file" id="archivo[]"size="45" /> 
El scritpt que uso para subir es:

Código PHP:
<?php
header 
("Location: index.php");

include(
"connect.php");

for (
$i=0$i <count($archivo); $i++){
//echo $i."<br>";

// archivo temporal (ruta y nombre).
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'][$i];

// leer del archivo temporal .. el binario subido. 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, peso y tipo.
$binario_nombre=$_FILES['archivo']['name'][$i]; 
$binario_peso=$_FILES['archivo']['size'][$i]; 
$binario_tipo=$_FILES['archivo']['type'][$i]; 

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO imagenes (id, codigo, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$codigo', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");

}
exit; 
?>
Para mostrar, uso el de miniaturas:

Código PHP:
<?php  

if(isset($_GET['id'])) { 

    include(
"connect.php");
    
    
$sql "SELECT archivo_binario,archivo_tipo,archivo_nombre FROM imagenes WHERE id='".$_GET['id']."'"
    
$consulta mysql_query($sql,$conexion); 
    
$imagen mysql_result($consulta,0,"archivo_binario");
    
$type mysql_result($consulta,0,"archivo_tipo"); 

    
// Envio cabeceras al navegador 
    
header("Content-type: $type"); 

    
// Generar el thumbnail: 

    // Se crea la imagen desde el campo binario de la BD 
    
$img imagecreatefromstring($imagen); 

    
// Tamaño del Thumbnail 
    
$picsize 100
     
    
// Se obtienen los datos del ancho y alto de la imagen. 
    
$new_w imagesx($img); 
    
$new_h imagesy($img); 

    
// Se calcula la relación alto/ancho 
    
$aspect_ratio $new_h $new_w
     
    
// Se ajusta al nuevo tamaño 
    
$new_w $picsize
    
$new_h abs($new_w $aspect_ratio); 

    
// Se crea la mascara de la imagen nueva 
    
$dst_img ImageCreateTrueColor($new_w,$new_h); 

    
// Se copia y reajusta el nuevo tamaño en la nueva imagen. 
     
imagecopyresampled($dst_img,$img,0,0,0,0,$new_w,$new_h,imagesx($img),imagesy($img)); 

    
// Se entrega al buffer de salida (navegador en este caso) la imagen en formato JPEG 
    // El tercer parámetro (100) indica la calidad de la imagen: en porcentaje relación calidad/peso imagen. 
    
imagejpeg($dst_img,'',100); 


?>
y luego el de mostrar en la página de resultados:

Código PHP:
<?
include ("connect.php");

if (isset(
$_GET['codigo'])){

$sql="SELECT * FROM imagenes WHERE codigo='".$_GET['codigo']."'";
$result=mysql_query($sql);

echo 
"<br><br><br>";
echo 
"<table width=365>";
echo 
"<tr>";
echo 
"<td align=left>";
echo 
"<font class=titulo_codigo>GALERIA DE IMAGENES</font>";
echo 
"<div align=left><hr size=1 width=350 noshade='noshade' color=#7b3f20></div>";
echo 
"<br>";
echo 
"<div align=left><font class=texto_codigo>Click en cualquier imagen para iniciar la galería</font></div>";
echo 
"</td></tr></table>";


$existeregistro=1;
$tamPag=15;
$columnes=3

if(!isset(
$_GET["pagina"])){ 
$pagina=1
$inicio=1
$final=$tamPag;
}

else{
$pagina $_GET["pagina"];

 
$limitInf=($pagina-1)*$tamPag

$numPags=ceil($numeroRegistros/$tamPag); 

if(!isset(
$pagina)){ 
$pagina=1
$inicio=1
$final=$tamPag
}

else{ 
$seccionActual=intval(($pagina-1)/$tamPag); 
$inicio=($seccionActual*$tamPag)+1

if(
$pagina<$numPags){ 
$final=$inicio+$tamPag-1
}

else{ 
$final=$numPags


if (
$final>$numPags){ 
$final=$numPags


}

mysql_free_result($result); 

$sql_dos="SELECT * FROM imagenes WHERE codigo='".$_GET['codigo']."' ORDER BY id LIMIT ".$limitInf.",".$tamPag
$result_dos=mysql_query($sql_dos);

if (
$existeregistro ==1){ 
echo 
"<table align=center border=0 cellpadding=0 width=365>"

for (
$i=1$row mysql_fetch_array ($result_dos); $i++){ 
$resto = ($i $columnes);

if (
$resto == 1) {echo "<tr>";}
echo 
"<td valign=top>"
echo 
"<a href='propiedad_grande.php?id=$row[id]&codigo=$row[codigo]'><img src=\"mini_galeria.php?id=".$row['id']."\" class=borde_imagen></a>";

if (
$resto == 0) {echo "</tr>";}


if (
$resto <> 0) {
$ajust $columnes $resto;

for (
$j 0$j $ajust$j++) {echo "<td>&nbsp;</td>";} 
echo 
"</tr>";

}
echo 
"</table>";
?>
Quisiera hacer el sistema de nuevo desde 0 pero no tengo tiempo ahora.

Se podrá modificar algunas lineas en los diferentes códigos para que funcione actualizado?

El cambio de blob a guardar en carpeta y ruta en BD es muy diferente al que utilizo? Cómo quedaría la tabla IMAGENES para guardar indefinidas rutas de imagenes para cada propiedad?

El form para subir varias imagenes de golpe, se puede hacer mejor?

Gracias por su ayuda!!!
  #2 (permalink)  
Antiguo 20/09/2009, 11:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 1 mes
Puntos: 2534
Respuesta: Ayuda para subir varias imagenes a carpeta y ruta a bd

Cita:
Iniciado por iarrieta Ver Mensaje
[...] Quisiera hacer el sistema de nuevo desde 0 pero no tengo tiempo ahora.

Se podrá modificar algunas lineas en los diferentes códigos para que funcione actualizado? [...]
¿¿que es lo que quieres decir??

tu no tienes el tiempo, pero esperas a que alguien del foro lo haga por ti??

porque además, de que unas "cuantas lineas" no hacen magia...

necesita mas esfuerzo, de veras ¿que quieres decir??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 20/09/2009, 11:31
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Ayuda para subir varias imagenes a carpeta y ruta a bd

Quiero decir que quizas solo hagan falta algunas lineas en cada codigo y podria adaptarlo.

he estado estudiando y en base a un curso en pdf que consegui por alli, hice mis propios codigos basicos con comentarios propios para referencia, por ejemplo subir UNA imagen a carpeta:

Código PHP:
<form name="formulario" id="formulario" method="post" action="<? echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
<input type="file" name="archivo" id="archivo" />
<input type="submit" name="submit" value="Cargar Archivo" />
</form>

<?
$ruta 
"img/"// Aquí indicamos la ruta de la carpeta donde guardaremos la imagen

/* Todos los datos cargados con HTTP y POST (method="post") se almacenan en el array $_FILES.
Nuestro campo "archivo" del formulario se convierte entonces en $_FILES['archivo]. Es una array asociativa como ya las hemos visto antes.
La array $_FILES contiene todos los datos del archivo cargado, como el nombre, el tamaño, el Mime-Type (.gif o .jpg) y el nombre temporal del archivo.
Después de cargar el archivo, PHP le asigna un nombre temporal y lo almacena en una carpeta temporal.
*/

if (isset ($_FILES['archivo']) && $_FILES['archivo']['size'] > 0) {  // Comprobamos si se cargo el archivo y si es mayor a 0 bytes, es decir, si es un archivo real
    
$tamanomax 500000// Creamos una variable con el tamaño máximo en bytes, en este caso 500Kb. PHP acepta hasta 2Mb
    
/* Para leer las propiedades de $_FILES['archivo'] simplemente agregamos otra key a su lado ['']
Para mayor comodidad, las propiedades se guardan como variables a utilizar en el código.    
*/
    
$nombretemp $_FILES['archivo']['tmp_name']; // Nombre temporal con el que se guarda el archivo en el servidor
    
$nombrearchivo $_FILES['archivo']['name']; // El nombre original del archivo
    
$tamanoarchivo $_FILES['archivo']['size']; // El tamaño del archivo cargado en bytes
    
/* La función GetImageSize() reconoce los archivos GIF, JPG, PNG y SWF y devuelve su altura, anchura y su tipo.
La función devuelve un array en matriz de 4 elementos:
    Index 0 corresponde a la anchura
    Index 1 corresponde a la altura
    Index 2 es un número en función al tipo de archivo de imagen (1: GIF, 2: JPG, 3: PNG y 4: SWF)
    Index 3 contiene la cadena de caracteres correcta en formato width="xxx" y height"xxx"
*/
    
$tipoarchivo GetImageSize ($nombretemp); // Aquí con GetImageSize leemos todos los datos del archivo temporal cargado y los almacenamos en la variable $tipoarchivo
    
/* El index 2 del array $tipoarchivo me indica con los números 1 - 2 - 3 si se trata de un GIF, un JPG o un PNG
Preguntamos si es GIF, JPG o PNG. Si eleminamos este if aceptará cualquier archivo
*/
    
if ($tipoarchivo[2] == || $tipoarchivo[2] == || $tipoarchivo[2] == 3) { // GIF, JPG o PNG?
    
if ($tamanoarchivo <= $tamanomax) { // Comprobamos el tamaño del archivo
    
/* La función move_uploaded_file() se encarga de trasladar el archivo temporal a una ubicación determinada por nosotros.
Se compone con el nombre del archivo temporal, la ruta en la que se va a guardar y su nombre real con el que quedará guardado
*/
    
if (move_uploaded_file ($nombretemp$ruta $nombrearchivo)) {
        echo 
"<p>La imagen se cargó con éxito!.<br>\n
        Tamaño de imagen: $tamanoarchivo bytes<br>\n
        Nombre: $nombrearchivo</p>"
;
    } else {
        echo 
"No se ha podido cargar la imagen";
    }
    } else {
        echo 
"La imagen tiene más de $tamanomax bytes y es muy pesada!";
    }
    } else {
        echo 
"No es una imagen GIF o JPG";
    }
    echo 
"<form action='{$_SERVER['PHP_SELF']}' method='post'>
          <input type='submit' value='OK'></form>"
;
    }
    
$filehandle opendir($ruta); // Abrimos la carpeta y devolvemos un "handle", una especie de apuntador, guardándolo en la variable $filehandle
    
/* La función readdir() lee los nombres de los archivos en la carpeta y los devuelve. para ello necesita el handle del archivo: readdir($filehandle)
Para luego utilizar el nombre del archivo, debo guardarlo en una variable: $file = readdir($filehandle)
Como generalmente hay más de un archivo en la carpeta, necesitamos un bucle que se mantenga activo hasta que readdir() haya leido todos los nombres en la carpeta,
para lo que entonces usamos al bucle while.
*/
    
while ($file readdir($filehandle)) {
        if (
$file != "." && $file != "..") { // Las funciones opendir() y readdir() devuelven en el echo los puntos de jerarquía en las carpetas, por lo que los filtramos
            
$tamano GetImageSize ($ruta $file); // Aqui con GetImageSize leemos el tamaño del archivo y se lo establecemos abajo con $tamano[3]
            
echo "<p><img src='$ruta$file' $tamano[3]><br></p>\n";
        }
    }
    
closedir($filehandle); // FIn de lectura de la carpeta
?>
Se que la mayoria de los cambios recientes se refiere a las variables globales, creo recordar que asi se llaman: $POST, $FILE, etc

Lo que quiero decir es que si he estado aprendiendo "el nuevo PHP" pero como no sabia realmente mucho del "viejo", quizas me quede un poco cuesta arriba generar desde 0 un nuevo sistema para la inmobiliaria en cuestion, por lo que pido ayuda a ver si quizas se pueda, en base a mis viejos codigos, modificar algunas cosas para adaptarlo.

Lo otro es que aprendi en su momento a subir como blob y lo domino, pero quisiera desarrollarlo ahora subiendo a carpeta (he leido que es mas "sano"). Se me tranca un poco la logica cuando pienso en como subir VARIAS imagenes de golpe (sus rutas) a la base de datos y luego para mostrarlas.

Quizas sea pan comido pero el cerebro no me ha estado funcionando muy bien despues de mandarme 2 manuales completos de php5, jejeje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:22.