Foros del Web » Programando para Internet » PHP »

Control de archivos duplicados

Estas en el tema de Control de archivos duplicados en el foro de PHP en Foros del Web. Hola a todos: He desarrollado una pequeña utilidad que me hizo falta, se trata de un sencillo programa que evita que al subir un archivo ...
  #1 (permalink)  
Antiguo 12/06/2005, 03:34
 
Fecha de Ingreso: mayo-2005
Mensajes: 31
Antigüedad: 18 años, 11 meses
Puntos: 0
Control de archivos duplicados

Hola a todos:
He desarrollado una pequeña utilidad que me hizo falta, se trata de un sencillo programa que evita que al subir un archivo al servidor, podamos destruir otro que tenga el mismo nombre accidentalmente, por ejemplo permitiendo que nuestros usuarios suban fotos a un tablon o algo asi.
El modo en que lo hace es el siguiente:
Comprueba si existe el archivo, y en caso de que exista, justo antes del punto-extension, le coloca un par de corchetes con un numero de forma similar a como lo hace windows:

3 ejemplos:
1. Si tratamos de subir al servidor una foto llamada "coche.jpg", y esta foto NO existe en el servidor, el nombre no se vera alterado y se guardara asi.
2. Si tratamos de subir al servidor una foto llamada "coche.jpg" y esta foto SI existe en el servidor, se guardara como "coche[1].jpg" (siempre y cuando este ultimo nombre tampoco exista en el servidor).
3. Si tratamos de subir una foto al serviro llamada "coche.jpg" y en el servidor existen las fotos "coche.jpg", "coche[1].jpg" y coche[2].jpg", la foto se guardara como "coche[3].jpg"

LIMITACIONES
--------------
1. Si el nombre de archivo o "path" contienen los caracteres "[" o "]", el comportamiento puede ser inesperado ya que la funcion se basa en "explodes" del nombre de origen para averiguar el siguiente numero que deberia encerrarse entre corchetes.
2. El nombre de archivo o "path" tampoco debe contener ningun punto adicional al normal, que es el que separa el nombre de la extension.

El modulo en cuestion es este:

--- CODIGO FUENTE ---
Código PHP:
<?php
function checkname($archivo)
  {
  while (
file_exists($archivo))
    {
    
$matriz=explode(".",$archivo);
    
$extension=$matriz[1];
    
$matriz=$matriz[0];
    
$matriz=explode("[",$matriz);
    
$nombre=$matriz[0];
    if (isset(
$matriz[1]))
      {
      
$matriz=$matriz[1];
      
$matriz=explode("]",$matriz);
      
$version=$matriz[0];
      }
    else
      {
      
$version=0;
      }
    
$version=$version+1;
    
$archivo=$nombre "[" $version"]." $extension;
    }
  return 
$archivo;
  }
?>
--- FIN CODIGO FUENTE ---

Este codigo lo metes en un archivo nuevo y lo llamas (por ejemplo) "checkname.php".

Desde otro documento .php (por ejemplo el que sube fotos al servidor) tan solo debes hacer 2 cositas:

1. Al principio del todo del documento, antes incluso de la primera etiqueta
<HTML>
colocas estas lineas:

Código PHP:
<?php
include("checkname.php");
?>
2. Justo antes de hacer el:

Código PHP:
move_uploaded_file($HTTP_POST_FILES['origen']['tmp_name'], $carpeta."/".$destino
Haces una llamada a la funcion:

Código PHP:
$destino=checkname($carpeta.'/'.$origen); 
Donde "$origen" es el nombre del archivo en el cliente web. Este nombre se lo pasamos a nuestro "checkname()" y ahi se comprueba si ya existe.
En caso de que exista realiza las operaciones antes comentadas y asi nos aseguramos de que nunca se destruya un archivo "accidentalmente".

ESTE CODIGO ESTA PROBADO EN PHP 4.3.3. Y FUNCIONA PERFECTAMENTE
Si tienes algun problema, revisa bien el codigo.

Espero que sirva de ayuda
Un saludo a todos
  #2 (permalink)  
Antiguo 12/06/2005, 20:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Buena la propuesta ..

Personalmente para estos casos siempre tomo la hora en formato UNIX TIMESTAMP (con time() ..) para añadir como parte del nombre del archivo que subo quedando algo tipo:

988878787_nombreArchivo.tal

Así nunca se repite. Si "ocasionalmente" por el uso intensivo del sistema .. se podría sutituir el uso simple de time() como generador de un dato aleatorio con algúnos algorítmos más complejos.

Un saludo,
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 11:33.