Trabajando con ficheros

Estoy inscrito en algunas listas de correo (mi preferencia mas que los foros) y voy a documentar dos cosas que hice en base a unas solicitudes de alguna de estas listas, comenzando con la ultima y mas interesante situacion de ayuda de un usuario, sobre tomar datos de un archivo plano y guardarlo en la BD. Luego el caso de guardar en la BD no el contenido sino informacion del archivo, nombre, tipo, tamanio, fecha, en este caso, un archivo de imagen que tambien es guardado en una carpeta, el clasico de subir una imagen al servidor.

Tomar datos de un archivo plano txt y guardarlo en la bd:

En mi pais no usamos el termino ‘fichero’ sino ‘archivo’ por lo que la descripcion a usar aqui en la explicacion sera la de ‘archivo’, aunque para el agrado de algunos en el codigo he indicado a la variable como $fichero.

Leo la necesidad de un usuario en una lista de correo de necesitar tomar unos datos de un archivo plano y guardarlos en la bd, indicando la situacion de un archivo con varias lineas las cuales son nombre y apellido, asumo y comprendo que seria un archivo con un contenido algo como este:

Ejemplo:
Ana Suarez
Gilberto Sanchez
Jose Diaz
Carlos Perez
Alberto Duarte
Maria Gonzalez

Es decir, una seria de nombres bien sea tabulados o no en su separacion de nombre y apellidos, entonces la idea aqui es leer el archivo, y tocar cada linea de string y separar en una variable el nombre y en otra el apellido para luego ingresarlos en la bd, suponiendo claro que la tabla de la bd posee los campos nombre y apellido separados, y tambien otro con el nombre completo porque no, aunque eso seria redundante.
La idea aqui es la siguiente:
Tomar por un <input type=”file” /> el archivo desde un formulario via post, acceder al archivo por la funcion fopen() en modo de lentura ‘r’ y nos pasearemos por dicha lectura obviamente con un while(!feof($fichero)), mientras no sea fin de archivo feof (file end of file) entonces seguirse ejecutando el ciclo/bucle, a quien guste podemos mostrar en pantalla el contenido del archivo, pero los screen los indico en comentarios, aqui solo me interesa tomar los datos del archivo plano y guardarlos en la bd.

<html>
<head>
<title>Manejo de Fichero</title>
</head>
<body>
<h3>Manejo de Fichero</h3>
<form name=”formulario” id=”formulario” method=”post” >
<label for=”nombref”>Fichero:</label>
<input type=”file” name=”elfichero” size=”50″ />
<input type=”submit” name=”enviar” />
</form>
</body>
<?php
$nombre_fichero = $_POST[‘elfichero’];
$fichero = fopen(‘/ruta_del_directorio/’.$nombre_fichero, ‘r’) or die(‘Error de lectura’);
mysql_connect(“localhost”,”miusuario”,”mipassword”) or die(“Error de conexion a la BD”);
mysql_select_db(“mibasedatos”) or die(“Error de conexion a la Tabla de la BD”);
$num_lineas = 0;
while(!feof($fichero)){
//$num_lineas++;
$buffer = fgets($fichero);
//echo “Linea $num_lineas: $buffer <br />”;

$pos = strpos($buffer,” “);
if($pos !== false) {
//echo “hay un espacio en blanco y esta en la posicion: “.$pos.”<br />”;
$nombre=substr($buffer,0,$pos);
$apellido=substr($buffer,$pos,20);
$apellido = trim($apellido);
}

//echo $nombre.'<br />’;
//echo $apellido.'<br />’;
//echo $buffer.'<br />’;

mysql_query(“insert into personas (nombre, apellido) values (‘$nombre’,’$apellido’)”);
//echo $buffer.'<br />’;
}
//$num_lineas = $num_lineas-1;
//echo “<br />El fichero tiene $num_lineas lineas/registros”;
fclose($fichero);
?>
<html>

Realmente nunca habia hecho esto de leer un archivo plano y guardar su contenido en la bd, pero se que eso tarde o temprano lo haremos, por ejemplo, para el caso de los dptos de cobranza, los archivos planos que envian los bancos, ademas de los que hay que hacerles. Los sistemas hacen archivos planos y reciben datos de otros, pero no todos los datos, sino algunos, los que se necesitan para actualizar la informacion o procesos en el sistema, por eso es que me intereso dicha situacion.

Ahora pasemos a la otra situacion sobre tomar un archivo de imagen, guardarlo en una carpeta y guardar en la bd, informacion del archivo tales como ruta, nombre, tipo, extension, tamanio, fecha, etc.

Subir archivo de imagen y guardar en la bd informacion sobre el archivo:

Para el caso de subir una imagen y guardar en la bd los datos del archivo (ya que es de imagen asi que contenido no obtendremos del archivo), lo dividire en unos archivos .php que son los siguientes:

formulario.html

<html>
<head>
<title>Upload Imagen</title>
</head>
<body>
<form name=”frmUploadImg” method=”post” enctype=”multipart/form-data” action=”imagen.php”>
<table>
<tr>
<td> Subir Imagen: </td>
<td> <input type=”file” name=”imagen” /> </td>
</tr>
<tr>
<td></td> <td> <input type=”submit” value=”Enviar” /> </td>
</tr>
</table>
</form>
</body>
</html>

procesar_imagen.php

<?php
include ‘conexion.php’;
conectar();

// datos del archivo de imagen:
$nombre = $_FILES[‘imagen’][‘name’];
$tmpNombre = $_FILES[‘imagen’][‘tmp_name’];
$tamano = $_FILES[‘imagen’][‘size’];
$tipo = $_FILES[‘imagen’][‘type’];
$error = $_FILE[‘imagen’][‘error’];
$directorio = ‘upload’;
$fecha = date(“Y-m-d”);
$archivo_upload = $directorio.$Nombre;

if (move_uploaded_file($tmpNombre, $directorio.”/”.$nombre)){
echo “El archivo ha sido cargado correctamente.”;
}else{
echo “Ocurrió algún error al subir el fichero. No pudo guardarse.”;
}

$query = “INSERT INTO imagenes (nombre, tipo, tamano, directorio, tmpNombre, fecha)
VALUES (‘”. $nombre .”‘, ‘” . $tipo . “‘, ‘” . $tamano . “‘, ‘” . $directorio . “‘, ‘” . $tmpNombre . “‘,'” . $fecha .”‘)”;
mysql_query($query) or die (“Error: “.mysql_error());

// Mostrar la imagen:
$query = “SELECT * FROM imagenes”;
$result = mysql_query($query);

if($result) {
while($row = mysql_fetch_row($result)) {
echo “Imagen: “.$row[‘nombre’];
echo “<br /><img src=’upload/”.$row[1].”‘ alt='”.$row[1].”‘ />”;
}
}

desconectar();
echo “<a href=’ver_imagen’>link</a>”;
?>

ver_imagen.php

<html>
<head>
<title>Viendo imagen</title>
<?php
include ‘conexion.php’;
conectar();
$consulta = mysql_query(“select * from imagenes”);
if($fila = mysql_fetch_array($consulta)){
$ruta = $fila[‘directorio’];
$archivo = $fila[‘nombre’];
$rutacompleta = $ruta .”/”. $archivo;
}
desconectar();
?>
</head>
<body>
<img src=”<?php echo $rutacompleta ?>” />
</body>
</html>

Puede ser todo en un mismo archivo o el formulario y luego llamar a quien procesa el archivo de imagen y ahi mismo mostrarse bien sea el archivo que se ha subido o indicarle mostrar todos, ya seria a gusto o necesidad de la situacion presentada.

enjoy!


About this entry