Foros del Web » Programando para Internet » PHP »

subir y renombrar archivos con php- move_upload_file

Estas en el tema de subir y renombrar archivos con php- move_upload_file en el foro de PHP en Foros del Web. buenas para todos. Tengo una aplicacion la cual una de las secciones es subir imagenes. -uno de los problemas que tenia era que si por ...
  #1 (permalink)  
Antiguo 05/03/2014, 20:54
Avatar de cristo995  
Fecha de Ingreso: noviembre-2012
Mensajes: 187
Antigüedad: 12 años
Puntos: 0
subir y renombrar archivos con php- move_upload_file

buenas para todos.
Tengo una aplicacion la cual una de las secciones es subir imagenes.
-uno de los problemas que tenia era que si por ejemplo subia una imagen con el mismo nombre de alguna otra imagen que ya se encontrara en dicho directorio:
-la imagen no se subia y aparte la otra que ya estaba se borraba o algo por el estilo.

investigando y en este mismo foro encontre esta solucion.

function random(){

$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwx yz234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmn opqrstuvwxyz234567890";
$cad = "";
for($i=0;$i<10;$i++) {
$cad .= substr($str,rand(0,120),1);
}

return $cad;

}

$nombre_archivo = $_FILES['archivo']['name'];
$nombre_archivo=random().".jpg";

if(move_uploaded_file($_FILES['archivo']['tmp_name'], "imagenes/$nombre_archivo")){

$msg.="El archivo ha sido cargado correctamente.<br>";


}

esto funciona de maravilla, ya que si la imagen se llama carro.jpg me queda guardada con el nombre QWEExx876t y cuando subo otra imagen se guarda con otra combinacion y asi sucesivamente ...


pero entonces mi pregunta es si en un futuro no habra problema de que dicha combinacion se repita y guarde una imagen con el mismo nombre de alguna otra que ya este y se me forme problema ??

que probabilidades hay de que alguna combinacion se repita ??
  #2 (permalink)  
Antiguo 06/03/2014, 04:56
 
Fecha de Ingreso: octubre-2012
Mensajes: 12
Antigüedad: 12 años, 1 mes
Puntos: 2
Respuesta: subir y renombrar archivos con php- move_upload_file

Hola buenas.

Pues supongo que las probabilidades serán muy pero que muy bajas.

Pero porque al nombre del archivo no le añades el día de hoy, así las probabilidades bajaran muchísimo, porque que en el mismo día te haga dos veces la misma combinación es casi imposible.
  #3 (permalink)  
Antiguo 06/03/2014, 05:42
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: subir y renombrar archivos con php- move_upload_file

¿Pq no compruebas si existe?
Código PHP:
while(file_exists($nombre_archivo)) $nombre_archivo=random().".jpg";

if(
move.... 
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 06/03/2014, 10:24
Avatar de cristo995  
Fecha de Ingreso: noviembre-2012
Mensajes: 187
Antigüedad: 12 años
Puntos: 0
Respuesta: subir y renombrar archivos con php- move_upload_file


pues muchas gracias. No se por que no se me ocurreio

aparte en el siclo for lo puse hasta <20 mas los datos de la fecha una imagen me quedaria de nombre: aYEUktCK24ZQmdLyWRPBe2014-03-06.jpg
seria deverdad algo casi imposible que el mismo dia se repitiera la misma combinacion jejej

gracias por tu ayuda.
  #5 (permalink)  
Antiguo 06/03/2014, 10:27
Avatar de cristo995  
Fecha de Ingreso: noviembre-2012
Mensajes: 187
Antigüedad: 12 años
Puntos: 0
Respuesta: subir y renombrar archivos con php- move_upload_file

da.. no conocia ese file_exis...
lo tendre en cuenta muchas gracias.
  #6 (permalink)  
Antiguo 06/03/2014, 10:40
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 2 meses
Puntos: 36
Respuesta: subir y renombrar archivos con php- move_upload_file

Te dejo como resolvi ese problema.

Código PHP:
Ver original
  1. //RUTA DONDE SE GUARDARAN LOS ARCHIVOS
  2. $destino = 'archivos/' ;
  3.  
  4. //SE DEFINEN LOS DATOS DEL ARCHIVO
  5. $nombre_archivo = $_FILES['archivo']['name'];
  6. $tipo = $_FILES['archivo']['type'];
  7. $tamano = $_FILES['archivo']['size'];
  8.  
  9. //GUARDAMOS EL ARCHIVOS
  10. move_uploaded_file ($_FILES ['archivo']['tmp_name'], $destino . '/' . $_FILES ['archivo']['name']);
  11.            
  12. //CONSTRUIMOS UN CODIGO UNICO PARA RENOMBRAR
  13. $codigo_fecha = date("YmdHis");        
  14. $no_aleatorio = rand(100, 999); //GENERAMOS TRES DIGITOS PARA INCORPORARLO AL FINAL DEL CODIGO
  15. $codigo = $codigo_fecha.$no_aleatorio; //CODIGO DE 17 DIGITOS
  16.  
  17. //RENOMBRAMOS EL ARCHIVO SUBIDO
  18. list($nombre, $ext) = explode(".", $nombre_archivo);
  19. $nombre_actual = "$codigo"."."."$ext" ;
  20. rename("archivos/$nombre_archivo","archivos/$nombre_actual");

Esto es solo un pedazo de codigo, faltan las validaciones y las comprobaciones si las extenciones y tamaños permitidos son validos.
  #7 (permalink)  
Antiguo 07/03/2014, 01:31
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: subir y renombrar archivos con php- move_upload_file

Y si el archivo lo sube con un nombre ya existente?

Lo sobreescribiria....

Deberías obtener primero el nombre, y después moverlo ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #8 (permalink)  
Antiguo 07/03/2014, 07:00
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 2 meses
Puntos: 36
Respuesta: subir y renombrar archivos con php- move_upload_file

Bueno, seria un poco dificil (aunque en la vida no hay nada imposible), que estuviera un archivo con un nombre identico al codigo construido, en el cual esta involucrada la fecha.
De todos modos, se pueden ingeniar variantes, como primero subir la imagen a una carpeta temporal y despues de cambiado el nombre, moverla a la carpeta original.
  #9 (permalink)  
Antiguo 07/03/2014, 07:03
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 2 meses
Puntos: 36
Respuesta: subir y renombrar archivos con php- move_upload_file

Bueno, seria un poco dificil (aunque en la vida no hay nada imposible), que estuviera un archivo con un nombre identico al codigo construido, en el cual esta involucrada la fecha.
De todos modos, se pueden ingeniar variantes, como primero subir la imagen a una carpeta temporal y despues de cambiado el nombre, moverla a la carpeta original.
  #10 (permalink)  
Antiguo 03/05/2015, 12:32
Avatar de menteccato  
Fecha de Ingreso: mayo-2015
Ubicación: Cádiz
Mensajes: 1
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: subir y renombrar archivos con php- move_upload_file

Efectivamente, en mi opinión, la solución aportada por alexisverano es la más adecuada. No solo aporta una cadena única -fecha y hora- sino que además incluye en sí misma una información adicional. Con la fecha y la hora sería suficiente en un entorno monousuario, pero un entorno que simultáneamente suban archivos multitud de personas, es más que probable los conflictos, por eso añadir una cadena adicional de 3 o más caracteres es lo más seguro.

Aún así me sorprende leer las dudas que plantea el método propuesto por el autor de este hilo: el de una cadena alfanumérica de 10 caracteres. Él preguntaba "¿qué probabilidades hay de que alguna combinacion se repita?" y en general todos se han limitado a decir que es muy poco probable. ¿Muy poco probable? ¿Sólo muy poco probable? Las variaciones de 10 elementos tomados de una serie de 62 (26 mayúsculas + 26 minúsculas + 10 números) es, matemáticamente: 62 elevado a 10. Y eso es lo bastante cercano a una posibilidad CERO. Para que os hagáis una idea es casi 1 posibilidad entre UN TRILLÓN. Una posibilidad entre un MILLÓN de BILLONES...

Entenderéis ahora que la posibilidad de hacer los mismo pero con una longitud de 20 caracateres + fecha, me haya parecido sorprendente. No son necesarias tantas precauciones cristo995, jajaja. Con 20 caracteres más la fecha ya ni lo calculo, no sabría ni nombrar esa cantidad...

Aún así se puede comprobar si el archivo existe... pero vamos, con ese algoritmo... yo no perdería ni quince segundos en ese código, es más fácil que me toque la bono-loto cada día durante una semana.

Última edición por menteccato; 03/05/2015 a las 12:52
  #11 (permalink)  
Antiguo 04/05/2015, 03:15
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: subir y renombrar archivos con php- move_upload_file

Cita:
Iniciado por menteccato Ver Mensaje
Efectivamente, en mi opinión, la solución aportada por alexisverano es la más adecuada. No solo aporta una cadena única -fecha y hora- sino que además incluye en sí misma una información adicional. Con la fecha y la hora sería suficiente en un entorno monousuario, pero un entorno que simultáneamente suban archivos multitud de personas, es más que probable los conflictos, por eso añadir una cadena adicional de 3 o más caracteres es lo más seguro.

Aún así me sorprende leer las dudas que plantea el método propuesto por el autor de este hilo: el de una cadena alfanumérica de 10 caracteres. Él preguntaba "¿qué probabilidades hay de que alguna combinacion se repita?" y en general todos se han limitado a decir que es muy poco probable. ¿Muy poco probable? ¿Sólo muy poco probable? Las variaciones de 10 elementos tomados de una serie de 62 (26 mayúsculas + 26 minúsculas + 10 números) es, matemáticamente: 62 elevado a 10. Y eso es lo bastante cercano a una posibilidad CERO. Para que os hagáis una idea es casi 1 posibilidad entre UN TRILLÓN. Una posibilidad entre un MILLÓN de BILLONES...

Entenderéis ahora que la posibilidad de hacer los mismo pero con una longitud de 20 caracateres + fecha, me haya parecido sorprendente. No son necesarias tantas precauciones cristo995, jajaja. Con 20 caracteres más la fecha ya ni lo calculo, no sabría ni nombrar esa cantidad...

Aún así se puede comprobar si el archivo existe... pero vamos, con ese algoritmo... yo no perdería ni quince segundos en ese código, es más fácil que me toque la bono-loto cada día durante una semana.
Aunq es algo viejo, vuelvo a ver el mismo fallo en ese código. Y no tiene que ver con las cadenas o las probabilidades, sino con que puedo borrar / sobreescribir cualquier fichero.

Imaginate, por un casual, que se que un usuario tiene la foto de perfil siguiente:
"20150504110854654.jpg", que sería una posible combinación que crearía el código de @alexisverano.

Ahora, yo creo una imagen, le pongo ese nombre, y la subo al servidor. ¿Qué pasaría?

Ese era el problema original del autor (podía sobreescribir imágenes) y la solución planteada en ese trozo de código(el que tu dices, de alexis), seguía con el mismo problema (aunq luego comentó la posibilidad correcta de una carpeta temporal).

Nunca está de más comprobar si un archivo existe o no ;). Sea una probabilidad entre 10 o entre 1 trillón.

Por ejemplo, he leído (del 2011) q a Facebook se suben 250 millones de foto al día. Diles que no hace falta más que 3 dígitos por segundo. O sólo 10 carácteres, cuando una foto suya puede ser, por ejemplo, "10632840_10152794513413045_5524611406974723287_n" .

Q si, q probablemente este usuario no tiene un "facebook", ni su capacidad, ni sus usuarios. Y por eso mismo la operación de comprobar si existe el fichero, no será tan costosa como para ignorarla
__________________
>> Eleazan's Source
>> @Eleazan
  #12 (permalink)  
Antiguo 04/05/2015, 08:29
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 15 años, 5 meses
Puntos: 13
Respuesta: subir y renombrar archivos con php- move_upload_file

Bajo mi punto de vista tienes 3 opciones viables:

1- Generar el nombre mediante time() (devuelve el tiempo en segundos desde 31/12/1969 a las 7:00 hasta ahora) y algún carácter aleatorio. De esta forma es muy pero que muy improbable que salgan dos iguales.

2- Un bucle que genere un nombre aleatorio y finalice cuando no exista ningún archivo con ese nombre. (con file_exists como te han dicho)

3- Si guardas las imágenes en una base de datos, estás obligado a que cada imagen tenga una ID. Utiliza esa ID y ya está.
  #13 (permalink)  
Antiguo 04/05/2015, 08:48
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: subir y renombrar archivos con php- move_upload_file

También puedes utilizar sha1_file para el nombre del archivo
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #14 (permalink)  
Antiguo 12/08/2015, 09:25
Avatar de tampon  
Fecha de Ingreso: julio-2009
Mensajes: 420
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: subir y renombrar archivos con php- move_upload_file

Buenos días, disculpen por seguir con el tema estuve probando el ejemplo de alexisverano y funciona muy bien pero al momento de sibir documentos que no sean JPG, me los renombra mal, la exención la cambia por la fecha si subo un .PDF le pone de exención .mar2 ¿Alguien me puede ayudar? Gracias.

veo que el nombre del documento se llama doc.mar2.pdf
  #15 (permalink)  
Antiguo 15/08/2015, 02:07
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: subir y renombrar archivos con php- move_upload_file

Cita:
Iniciado por tampon Ver Mensaje
Buenos días, disculpen por seguir con el tema estuve probando el ejemplo de alexisverano y funciona muy bien pero al momento de sibir documentos que no sean JPG, me los renombra mal, la exención la cambia por la fecha si subo un .PDF le pone de exención .mar2 ¿Alguien me puede ayudar? Gracias.

veo que el nombre del documento se llama doc.mar2.pdf
Sigo pensando que ese código no es bueno, pero en fin...

Tu problema está en esta línea:

Código PHP:
list($nombre$ext) = explode("."$nombre_archivo); 
Guarda en $nombre y en $ext el resultado [0] y [1] del explode... al tener varios puntos, el [1] no es la extensión, y de ahí que falle ;)

Sería mejor usar pathinfo:
Código PHP:
list($nombre$ext) = pathinfo($destino '/' $nombre_archivoPATHINFO_BASENAME PATHINFO_EXTENSION); 
De todas formas, recalco que ese código no es seguro.
Allá tu con lo que pongas en tu servidor ;)
__________________
>> Eleazan's Source
>> @Eleazan

Etiquetas: imagenes, renombrar
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 22:09.