Foros del Web » Programando para Internet » PHP »

¿como scanear una carpeta y cargar sus archivos en una db?

Estas en el tema de ¿como scanear una carpeta y cargar sus archivos en una db? en el foro de PHP en Foros del Web. Gente: tengo una carpeta con 20000 jpg, y me gustaría hacer un registro de eso una db. ¿hay alguna función de php que pueda "scanear" ...
  #1 (permalink)  
Antiguo 14/12/2009, 08:09
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
¿como scanear una carpeta y cargar sus archivos en una db?

Gente: tengo una carpeta con 20000 jpg, y me gustaría hacer un registro de eso una db.
¿hay alguna función de php que pueda "scanear" o leer esa carpeta, como para luego, con un bucle, ir metiendo cada archivo como si fuera un registro dentro de una db en mysql?
¿alguna idea o sugerencia?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #2 (permalink)  
Antiguo 14/12/2009, 08:16
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 8 meses
Puntos: 77
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

opendir
readdir
  #3 (permalink)  
Antiguo 14/12/2009, 08:22
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

¿20.000 imagenes alojadas en la base de datos? ¿no seria mejor tan solo guardar la ruta de la imagen con la demas info y tener las imagenes como archivos? No soy muy entendido en eso, pero creo que una consulta de varias imagenes x multitud de usuarios puede ser brutal para la carga de CPU de esa forma....

Aqui tienes una busqueda para listar los archivos: http://www.google.es/#hl=es&q=+site:...5b4b4e692dabd4

Y aqui sobre el tema de guardar en base de datos: http://www.google.es/#hl=es&q=+site%...5b4b4e692dabd4
  #4 (permalink)  
Antiguo 14/12/2009, 08:28
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
Darkasecas y bun, muchas gracias.
El tema es el siguiente: se trata de un tatuador que tiene las imágenes para su tienda de tatuajes, y quiere asignarles categorías y niveles de dificultad a cada uno.
El sistema correría en su propia pc, y recibiría una consulta a la vez, no estaría online.

Veré qué puedo hacer con sus respuestas; gracias.

Excelente, lo hice con el siguiente script:
Código:
include ("conexion.php");
$conexion = mysql_connect ($host, $user, $pass);
mysql_select_db ($base, $conexion);
$the_array = Array();
$handle = opendir('../fotos/.');
while (false !== ($file = readdir($handle))) {
   if ($file != "." && $file != "..") {
   $the_array[] = $file;
   }
}
closedir($handle);
sort ($the_array);
foreach($the_array as $val){

$sql= "insert into tattoos_tattoos (imagen)
values ('$val')"; 
$result= mysql_query($sql, $conexion);

}
Mejorando el script, conseguí que, dependiendo del nombre del archivo, pueda asignar una categoría de complejidad a cada registro.

Lo que necesitaría ahora es hacer que el script scanee subcarpetas, y cree sub-categorías para cada carpeta.

Por ejemplo, si scanea la carpeta "animales", y dentro de esa hay "caninos", "felinos" y "roedores", que entre en cada una, y asigne ese título a la subcategoría.

Dejó aquí el script que estoy aplicando ahora por si alguien se le ocurre cómo puedo modificarlo:

Código:
		  <? 
if ($carpeta=="")
{?>
        </p>
		<form action="scan.php" method="get">
<p>Primero copie la carpeta dentro de la carpeta &quot;fotos&quot;. El nombre de la carpeta ser&aacute; asignado como nombre de la categor&iacute;a. </p>
<p>Ingrese el nombre de la carpeta a scanear: 
  <input type="text" name="carpeta" />
</p>
<p><input type="submit" name="Submit" value="Scanear"/></p>
</form>

<? }

else
{


$the_array = Array();
$handle = opendir("../fotos/$carpeta");
while (false !== ($file = readdir($handle))) {
   if ($file != "." && $file != "..") {
   $the_array[] = $file;
   }
}
closedir($handle);
sort ($the_array);
foreach($the_array as $val){

/*SEPARAR FRAGMENTOS ARCHIVO*/



    list($complejidad,$galeria,$nombre) = explode("-",$val);
switch ($complejidad)
{
case "A":
$complejidadn=1;
break;
case "B":
$complejidadn=1.5;
break;
case "C":
$complejidadn=2;
break;
case "D":
$complejidadn=2.5;
break;
case "E":
$complejidadn=3;
break;
}
if (copy( "../fotos/$carpeta/$val", "../fotos/$val"))
{
unlink("../fotos/$carpeta/$val"); 
}

$sql="insert into tattoos_tattoos (imagen, galeria, nombre, complejidad)
values ('$val', '$galeria', '$nombre', '$complejidadn')";
if ($result= mysql_query($sql, $conexion))
{ echo $sql."<br/>"; }

}

		$sql = "SELECT distinct galeria FROM tattoos_tattoos"; 
		$result = mysql_query($sql, $conexion); 
		if ($row = mysql_fetch_array($result)){ 
		mysql_field_seek($result,0); 
		do { 
		$galeria=$row['galeria'];
		
			$sqlar="insert into tattoos_galerias (imagen, nombre)
			values ('nofoto.jpg', '$galeria')";
			$resultar= mysql_query($sqlar, $conexion);

		}
		while ($row = mysql_fetch_array($result)); 
		} 
		


}



?>

GRACIAS!
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar

Última edición por GatorV; 08/01/2010 a las 15:18
  #5 (permalink)  
Antiguo 05/01/2010, 09:33
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 8 meses
Puntos: 77
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

Puedes usar is_dir dentro del ciclo, para saber si lo que estas leyendo es un directorio, y si es asi abrirlo con opedir y hacer el mismo proceso de leer su contenido.

Si solo son dos niveles (categoria y subcategoria) puedes poner todo el proceso de nuevo dentro del segundo ciclo, o usar una funcion. Si puede que sean mas niveles y/o no siempre seran la misma cantidad podrias usar una funcion recursiva.
  #6 (permalink)  
Antiguo 08/01/2010, 14:07
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

muchas gracias darkasecas.
luego lo pruebo y te cuento cómo me fue.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #7 (permalink)  
Antiguo 11/01/2010, 07:16
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

Bueno, mientras pienso cómo solucionarlo, lo dejo planteado por si a alguno se le ocurre algo mejor, antes que a mí. El tema es que la variable (array) $file, si es una carpeta, le digo que entre y la scanee, pero no sé cómo hacer para que no siga siendo $file, sino $dir. Porque luego me inserta como registro un directorio, cuando en realidad debe insertar sólo los archivos.

Lo que hice fue esto

Código:
		<form action="scan2.php" method="get">
<p>Primero copie la carpeta dentro de la carpeta &quot;fotos&quot;. El nombre de la carpeta ser&aacute; asignado como nombre de la categor&iacute;a. </p>
<p>Ingrese el nombre de la carpeta a scanear: 
  <input type="text" name="carpeta" />
</p>
<p><input type="submit" name="Submit" value="Scanear"/></p>
</form>

<? }

else
{


$the_array = Array();
$handle = opendir("../fotos");
while (false !== ($file = readdir($handle))) {
   if ($file != "." && $file != "..") {
   $the_array[] = $file;
   }
   
if (is_dir($file))
{
$handle = opendir("../fotos/$file");
while (false !== ($file = readdir($handle))) {
   if ($file != "." && $file != "..") {
   $the_array[] = $file;
   }

}
closedir($handle);
sort ($the_array);
foreach($the_array as $val){

/*SEPARAR FRAGMENTOS ARCHIVO*/



    list($complejidad,$galeria,$nombre) = explode("-",$val);
switch ($complejidad)
{
case "A":
$complejidadn=1;
break;
case "B":
$complejidadn=1.5;
break;
case "C":
$complejidadn=2;
break;
case "D":
$complejidadn=2.5;
break;
case "E":
$complejidadn=3;
break;
}
if (copy( "../fotos/$carpeta/$val", "../fotos/$val"))
{
unlink("../fotos/$carpeta/$val"); 
}

$sql="insert into tattoos_tattoos (imagen, galeria, nombre, complejidad)
values ('$val', '$galeria', '$nombre', '$complejidadn')";
if ($result= mysql_query($sql, $conexion))
{ echo $sql."<br/>"; }

}

		$sql = "SELECT distinct galeria FROM tattoos_tattoos"; 
		$result = mysql_query($sql, $conexion); 
		if ($row = mysql_fetch_array($result)){ 
		mysql_field_seek($result,0); 
		do { 
		$galeria=$row['galeria'];
		
			$sqlar="insert into tattoos_galerias (imagen, nombre)
			values ('nofoto.jpg', '$galeria')";
			$resultar= mysql_query($sqlar, $conexion);

		}
		while ($row = mysql_fetch_array($result)); 
		} 
		


}   


}
closedir($handle);
sort ($the_array);
foreach($the_array as $val){

/*SEPARAR FRAGMENTOS ARCHIVO*/



    list($complejidad,$galeria,$nombre) = explode("-",$val);
switch ($complejidad)
{
case "A":
$complejidadn=1;
break;
case "B":
$complejidadn=1.5;
break;
case "C":
$complejidadn=2;
break;
case "D":
$complejidadn=2.5;
break;
case "E":
$complejidadn=3;
break;
}
if (copy( "../fotos/$carpeta/$val", "../fotos/$val"))
{
unlink("../fotos/$carpeta/$val"); 
}

$sql="insert into tattoos_tattoos (imagen, galeria, nombre, complejidad)
values ('$val', '$galeria', '$nombre', '$complejidadn')";
if ($result= mysql_query($sql, $conexion))
{ echo $sql."<br/>"; }

}

		$sql = "SELECT distinct galeria FROM tattoos_tattoos"; 
		$result = mysql_query($sql, $conexion); 
		if ($row = mysql_fetch_array($result)){ 
		mysql_field_seek($result,0); 
		do { 
		$galeria=$row['galeria'];
		
			$sqlar="insert into tattoos_galerias (imagen, nombre)
			values ('nofoto.jpg', '$galeria')";
			$resultar= mysql_query($sqlar, $conexion);

		}
		while ($row = mysql_fetch_array($result)); 
		} 
		


}
¿Es muy desordenado? tengo que hacer más pruebas, pero aparentemente, entró en cada directorio; sólo faltaría utilizar otro nombre de variable pero no veo en donde ponerlo.
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #8 (permalink)  
Antiguo 11/01/2010, 08:41
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

Desglosando el problema, intento esto:
creo tres carpetas dentro de "fotos" (prueba1, prueba2, prueba3)
y ejecuto este código, a ver si me las detecta:

Código:
$the_array = array();
$handle = opendir("../fotos");
while (false !== ($file = readdir($handle))) {

   if ( is_dir($file)  ) {

   $the_array[] = $file;
   }


}
closedir($handle);
sort ($the_array);
foreach($the_array as $val)

{
echo $val;
echo "<br>"; 

}

Pero sólo me muestra "." y "..", no me muestra las carpetas creadas... ¿por qué?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
  #9 (permalink)  
Antiguo 11/01/2010, 09:37
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 20 años, 1 mes
Puntos: 1
Respuesta: ¿como scanear una carpeta y cargar sus archivos en una db?

tema resuelto:

Si no está entre "", no interpreta la variable como directorio cuando la paso por is_dir.

el código final me quedó así:

Código:
$the_array2 = array();
$handle2 = opendir("../fotos");
while (false !== ($carpeta = readdir($handle2))) {

   if ($carpeta !="." and $carpeta!=".." and is_dir("../fotos/$carpeta")) {

   $the_array2[] = $carpeta;
   }


}
closedir($handle2);
sort ($the_array2);
foreach($the_array2 as $val2)

{





$the_array = array();
$handle = opendir("../fotos/$val2");
while (false !== ($file = readdir($handle))) {
   if ($file != "." && $file != "..") {
   $the_array[] = $file;
   }
}
closedir($handle);
sort ($the_array);
foreach($the_array as $val)

{

	/*SEPARAR FRAGMENTOS ARCHIVO*/
	list($complejidad,$galeria,$nombre) = explode("-",$val);
	switch ($complejidad)
	{
	case "A":
	$complejidadn=1;
	break;
	case "B":
	$complejidadn=1.5;
	break;
	case "C":
	$complejidadn=2;
	break;
	case "D":
	$complejidadn=2.5;
	break;
	case "E":
	$complejidadn=3;
	break;
	}
	
	/*COPIA LOS ARCHIVOS A LA RAÍZ*/
	if (copy( "../fotos/$val2/$val", "../fotos/$val"))
	{
	/*ELIMINA LOS ARCHIVOS DE LA CARPETA*/
	unlink("../fotos/$val2/$val"); 
	
	}
/*INSERTA LOS REGISTROS EN LA DB*/
	$sql="insert into tattoos_tattoos (imagen, galeria, nombre, complejidad)
	values ('$val', '$galeria', '$nombre', '$complejidadn')";
	if ($result= mysql_query($sql, $conexion))
	{ echo $sql."<br/>"; }
	
	}
	if (rmdir("../fotos/$var2"))
{echo "$var2 elimnado <br>"; }
else
{echo "$var2 NO elimnado <br>"; }

/*GRABA LA GALERÍA EN LA DB*/
	$sql = "SELECT distinct galeria FROM tattoos_tattoos"; 
	$result = mysql_query($sql, $conexion); 
	if ($row = mysql_fetch_array($result)){ 
	mysql_field_seek($result,0); 
	do { 
	$galeria=$row['galeria'];
	
	$sqlar="insert into tattoos_galerias (imagen, nombre)
	values ('nofoto.jpg', '$galeria')";
	$resultar= mysql_query($sqlar, $conexion);
	
	}
	while ($row = mysql_fetch_array($result)); 
} 


	
}
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
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

SíEste tema le ha gustado a 1 personas




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