Foros del Web » Programando para Internet » PHP »

Nombre irrepetible para imágenes

Estas en el tema de Nombre irrepetible para imágenes en el foro de PHP en Foros del Web. Buenas, gente. ¿Cómo hacéis vosotros para evitar que al subir imágenes al servidor desde un formulario se repitan los nombres de las imágenes? Yo hasta ...

  #1 (permalink)  
Antiguo 07/09/2013, 08:33
 
Fecha de Ingreso: febrero-2003
Mensajes: 39
Antigüedad: 21 años, 9 meses
Puntos: 1
Nombre irrepetible para imágenes

Buenas, gente. ¿Cómo hacéis vosotros para evitar que al subir imágenes al servidor desde un formulario se repitan los nombres de las imágenes?
Yo hasta ahora, al escalarlas y subirlas las renombraba con un time(), y así cada foto tenía el nombre de la fecha en segundos de cuando se había subido. Se hace o hacía con frecuencia así.
El problema es que ahora que estoy subiendo múltiples fotos a la vez con jquery, se hace tan rápido que se pisa la foto con el mismo nombre. Con microtime() funciona, pero queda horrible, por el decimal. Podría convertirlo entero y carretera, pero tengo curiosidad por saber vuestro método.
  #2 (permalink)  
Antiguo 07/09/2013, 08:58
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Existe una funcion para comprobar si un archivo existe:
Código PHP:
Ver original
  1. if (file_exists('url')){
  2. // Rename
  3. $_FILES['archivo']['name'] .= rand();
  4. }
  #3 (permalink)  
Antiguo 07/09/2013, 09:02
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Hace unos dias hice yo esto mismo en mi web.
Do {
genero con mt_rand un entero entre 0 y maxint, le saco el hash con md5 y le concateno la extension.
}mientras(exista un archivo con este nombre);
Aqui es donde guardo el archivo con el ultimo nombre generado;

Yo saco el md5 del entero para tener nombres mas o menos regulares, pero es realmente obligatorio?
  #4 (permalink)  
Antiguo 07/09/2013, 09:21
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Mmm... Puedes hacer un checksum con sha-1 mejor y dejarle solo 10 caractéres:

Código PHP:
Ver original
  1. if (file_exists('url')){
  2. // Rename
  3. $_FILES['archivo']['name'] .= '_'.substr(sha1(rand(1,999)),0,-30);
  4. }
  #5 (permalink)  
Antiguo 07/09/2013, 09:24
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Asi lo que haces es no permitir que suban mas de 999 (incluso menos) archivos que se llamen igual
  #6 (permalink)  
Antiguo 07/09/2013, 09:30
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Da un poco igual que uses md5, sha1 o sha256 si al final solo tienes 999 ( o 99999999) nombres diferentes, no se si me entiendes.. casi seguro que no tienes colisiones. Pero si tanto te preocupan las colisiones, no hagas checksum :D

La forma 100% segura es generar un nombre aleatorio bastante largo y comprobar que no existe. Si existe, vuelta a empezar; si no existe, te quedas con el.
  #7 (permalink)  
Antiguo 07/09/2013, 09:31
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por Onedy Ver Mensaje
Asi lo que haces es no permitir que suban mas de 999 (incluso menos) archivos que se llamen igual
La posibilidad de que se repitan es nula. Podria coincidir con el num, pero ademas le hace un hash en sha1.
  #8 (permalink)  
Antiguo 07/09/2013, 09:33
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Información Respuesta: Nombre irrepetible para imágenes

Nunca he llegado a comprender eso pero me parece que nunca dan el mismo valor...Voy a probar...
  #9 (permalink)  
Antiguo 07/09/2013, 09:36
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

La posibilidad de que se repitan generando numeros entre 1 y 999 es peligorsamente alta, y crece segun se creen mientras se vayan ocupando numeros.

Y da igual que le apliques el algoritmo sha1 o el sha4096, el hash de '23' es el mismo hoy y mañana, no varia con el tiempo
  #10 (permalink)  
Antiguo 07/09/2013, 09:38
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por Onedy Ver Mensaje
La posibilidad de que se repitan generando numeros entre 1 y 999 es peligorsamente alta, y crece segun se creen mientras se vayan ocupando numeros.

Y da igual que le apliques el algoritmo sha1 o el sha4096, el hash de '23' es el mismo hoy y mañana, no varia con el tiempo
A mi me dan diferentes:
md5(4) == a87ff679a2f3e71d9181a67b7542122ca87ff6
md5(4) == 79a2f3e71d9181a67b7542122c
  #11 (permalink)  
Antiguo 07/09/2013, 09:39
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Te lo estoy diciendo.. la clave es
a) tener a mano un gran intervalo de posibilidades,
b) escoger una posibilidad y
c) comprobar que no se repita
  #12 (permalink)  
Antiguo 07/09/2013, 09:41
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Pues ponemos solo rand() y volvemos a pasar la funcion. Eso ya está, pero he probado eso en mi host local y me da diferentes valores...
  #13 (permalink)  
Antiguo 07/09/2013, 09:42
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por PHPeros Ver Mensaje
A mi me dan diferentes:
md5(4) == a87ff679a2f3e71d9181a67b7542122ca87ff6
md5(4) == 79a2f3e71d9181a67b7542122c
Yo que tu revisaria eso asegurate de que es eso lo que realmente haces
  #14 (permalink)  
Antiguo 07/09/2013, 09:43
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Entonces sería muy facil hacer fuerza bruta no?
  #15 (permalink)  
Antiguo 07/09/2013, 09:44
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Los hash se usan precisamente para saber que un mensaje no ha cambiado, como podrian usar los hashsi estos variaran con el tiempo?
  #16 (permalink)  
Antiguo 07/09/2013, 09:46
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por PHPeros Ver Mensaje
Entonces sería muy facil hacer fuerza bruta no?
Emmm no es que sea muy facil precisamente. De hecho hay potentes ordenadores que estan buscando colisiones.. :)
  #17 (permalink)  
Antiguo 07/09/2013, 09:52
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Entonces cualquier hash podria ser desencriptado si saben la combinación no?
  #18 (permalink)  
Antiguo 07/09/2013, 09:56
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Te doy la razón porque acabo de comprobarlo. :XD:
  #19 (permalink)  
Antiguo 07/09/2013, 09:59
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por PHPeros Ver Mensaje
Entonces cualquier hash podria ser desencriptado si saben la combinación no?
Mas o menos, si vives lo suficiente

Estrictamente hablando, a cada string/numero/etc le corresponde un hash, mientras que a cada hash le puede corresponder varios strings/enteros etc, aunque se intenta que esto no pase
  #20 (permalink)  
Antiguo 07/09/2013, 10:04
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Nombre irrepetible para imágenes

Generar un aleatorio para evitar nombres irrepetibles tarde o temprano va a generar una colisión.


Yo hago algo muy simple.

Si la imagen está asociada a un registro, creo una carpeta con el id del registro, dentro de la carpeta almacenos las imágenes asociadas al registro y ni siquiera tengo que almacenar el nombre de las imágenes en la base de datos ya que cuando quier recuperar las imágenes sólo leo todo lo que hay en la carpeta.

Si la imagen no se asocia a un registro o bien si la carpeta donde se va a almacenar las imágenes es compartida, simplemente verifico si el nombre existe, y si existe hago un ciclo agregando un número hasta que ya no exista, por ejemplo:

suben la imagen patito.jpg si existe, agrego el número 1, si existe patito1.jpg, paso al 2, si existe patito2.jpg.... así hasta que no haya un archivo con el mismo nombre.
  #21 (permalink)  
Antiguo 07/09/2013, 10:06
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Exclamación Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por Onedy Ver Mensaje
Mas o menos, si vives lo suficiente

Estrictamente hablando, a cada string/numero/etc le corresponde un hash, mientras que a cada hash le puede corresponder varios strings/enteros etc, aunque se intenta que esto no pase
Ok, todo aclarado. Pero si han conseguido desencriptar los paquetes SSL de https por vulnerabilidades, algún chino friki hará lo mismo con los de PHP. Saludos
  #22 (permalink)  
Antiguo 07/09/2013, 10:10
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por ocp001a Ver Mensaje
Generar un aleatorio para evitar nombres irrepetibles tarde o temprano va a generar una colisión.


Yo hago algo muy simple.

Si la imagen está asociada a un registro, creo una carpeta con el id del registro, dentro de la carpeta almacenos las imágenes asociadas al registro y ni siquiera tengo que almacenar el nombre de las imágenes en la base de datos ya que cuando quier recuperar las imágenes sólo leo todo lo que hay en la carpeta.

Si la imagen no se asocia a un registro o bien si la carpeta donde se va a almacenar las imágenes es compartida, simplemente verifico si el nombre existe, y si existe hago un ciclo agregando un número hasta que ya no exista, por ejemplo:

suben la imagen patito.jpg si existe, agrego el número 1, si existe patito1.jpg, paso al 2, si existe patito2.jpg.... así hasta que no haya un archivo con el mismo nombre.
Eso va a hacerse pesado cuando vayas por el patito99999: para agregar otro patito vas a estar comprobando 99999 veces si existen patitos.

Si lees mi post donde doy los pasos a, b y c, veras que compruebo que no existe un nombre, pero a diferencia de tu modelo, no compruebo tantas veces si hay una colision.
  #23 (permalink)  
Antiguo 07/09/2013, 10:34
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 4 meses
Puntos: 55
Respuesta: Nombre irrepetible para imágenes

Hola, concuerdo con Onedy.

En mi caso uso

Código PHP:
    do{
    
$alias_file=substr(str_shuffle(str_repeat('ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz01234567890123456789012345678901234567890123456789',15)),0,100);

    } while (...
existe file...); 
Cambias los valores, dependiendo de tu nivel de paranoia.

Saludos
  #24 (permalink)  
Antiguo 07/09/2013, 10:38
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por Onedy Ver Mensaje
Eso va a hacerse pesado cuando vayas por el patito99999: para agregar otro patito vas a estar comprobando 99999 veces si existen patitos.

Si lees mi post donde doy los pasos a, b y c, veras que compruebo que no existe un nombre, pero a diferencia de tu modelo, no compruebo tantas veces si hay una colision.
Esto sería si todos los usuarios subieran archivos con el mismo nombre (para el ejemplo patito.jpg)

ahora bien, si en los pasos abc te refieres a

Cita:
Do {
genero con mt_rand un entero entre 0 y maxint, le saco el hash con md5 y le concateno la extension.
}mientras(exista un archivo con este nombre);
El caso es casi igual: entre más archivos haya con el mismo nombre, más veces se tendrá que comprobar, con el añadido de tener que crear el aleatorio y luego el hash.

La única ventaja sería si hay pocos archivos, pongamos por ejemplo un rango de 0 a 100, y ya se han subido 5 archivos.

Con mi método se tendría que comprobar 5 veces para que ya no se repitiera el nombre (patito 6).
Con tu método, es posible (de hecho muy probable) que a la primera nos diera un nombre diferente.

Pero ahora supongamos para el mismo rango de 0 a 100 nombres, que ya se han ocupado 80.

Con mi método, se harán 80 comprobaciones.
Con tu método, tanto es posible que nos de un número libre a la primera como es posible que nos de números ocupados muchas veces, ya que sólo tiene el 20 por ciento de posibilidades de acertar a un número libre, con lo que es posible que se hagan más de 80 comprobaciones. Y entre menos números libres queden la cantidad de comprobaciones aumentará.

Si haces una simulación a obtener números libres en estas condiciones lo verás.

Por otro lado, el método que yo propuse es para pocos archivos y sin depender de llevar un registro, si se va a almacenar muchos archivos en la misma carpeta y se sabe que va a haber repetidos, se puede hacer simplemente guardando el último nombre, digamos que llegamos a patito999, el siguiente secuencia será patito1000 y ya está.

Supongamos la prima vez que se guarda la imagen patito.jpg

Almacenamos sólo el nombre en algún lugar "patito/0"

si suben otro patito.jpg, comprobamos que ya existe, por lo tanto aumentamos el índice y lo almacenamos "patito/1";
  #25 (permalink)  
Antiguo 07/09/2013, 10:51
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

ocp001a Muy currado, pero de esa forma te pueden ver todas las imagenes incrementando su valor en uno. Es un fallo muy común y hace las mismas de un directory listing.
  #26 (permalink)  
Antiguo 07/09/2013, 11:26
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Nombre irrepetible para imágenes

¿Fallo? no se ha hablado de un directorio de imágenes protegido. Para proteger las imágenes nada mejor que sacarlas de la carpeta web.

Por otra parte, si alguien quisiera obtener las imágenes tampoco es tan complicado hacer el hash de números para una secuencia.
  #27 (permalink)  
Antiguo 07/09/2013, 11:33
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por ocp001a Ver Mensaje
¿Fallo? no se ha hablado de un directorio de imágenes protegido. Para proteger las imágenes nada mejor que sacarlas de la carpeta web.

Por otra parte, si alguien quisiera obtener las imágenes tampoco es tan complicado hacer el hash de números para una secuencia.
Si ya lo combinamos con letras... Como se podría??
  #28 (permalink)  
Antiguo 07/09/2013, 11:36
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

$strings = Array('a','b','c');
echo $strings[mt_random(1,count($strings))];

???
  #29 (permalink)  
Antiguo 07/09/2013, 11:37
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 4 meses
Puntos: 55
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por PHPeros Ver Mensaje
Si ya lo combinamos con letras... Como se podría??
No es posible si usas un valor completamente aleatorio.
  #30 (permalink)  
Antiguo 07/09/2013, 11:41
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 3 meses
Puntos: 578
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por Erick_MD9 Ver Mensaje
No es posible si usas un valor completamente aleatorio.
Con mi codigo sip.

Etiquetas: formulario, nombre
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 11:26.