Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/06/2005, 03:34
mcf924
 
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