entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

cambiar nombre de archivo si existe PHP

Hola. Me ha surgido un problemilla inesperado. Me he dado cuenta que cuando quiero subir una imagen desde un iphone en la web, esa imagen siempre se llama igual, image.jpg. Tengo una condición en el código que controla esto, para que se suban fotos iguales. pero claro, el problema es no son iguales, sino que las llama todas igual, y solo se sube una, a no ser que yo vaya cambiando el nombre de las imágenes que se han subido antes en la carpeta, pero esto es una burrada.
Mi intención es que en if para controlar si ya existe una imagen con ese nombre, sustituya este nombre por la fecha y hora en que se esta subiendo, por ejemplo, cambiar image.jpg por 12-12-2015 18:20:20, de esta manera, sería mucha casualidad que se fuesen a subir más de una imagen en el mismo segundo.
Pero no tengo ni idea de como cambiar esto, por que veo que la variable es ["name"], pero si la cambio igual le estoy quitando también la extensión .jpg.................Bueno, os dejo el código a ver que opináis:

    <?php
if(isset($_POST['boton'])){
    // Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
    if ((($_FILES["archivo"]["type"] == "image/gif") ||
    ($_FILES["archivo"]["type"] == "image/jpeg") ||
    ($_FILES["archivo"]["type"] == "image/jpg") ||
    ($_FILES["archivo"]["type"] == "image/pjpeg")) &&
    ($_FILES["archivo"]["size"] < 2000000)) {

    //Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
      if ($_FILES["archivo"]["error"] > 0) {
        echo $_FILES["archivo"]["error"] . "";
      } else {
        // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
        if (file_exists("archivos/" . $_FILES["archivo"]["name"])) {
          echo $_FILES["archivo"]["name"] . " ya existe. ";
        } else {
         // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
          move_uploaded_file($_FILES["archivo"]["tmp_name"],
          "archivos/" . $_FILES["archivo"]["name"]);
          echo "Archivo Subido ";
          echo '<img src="archivos/".$_FILES["archivo"]["name"]>';
        }
      }
    } else {
        // Si el usuario intenta subir algo que no es una imagen o una imagen que pesa mas de lo permitido mostramos este mensaje
        echo "Archivo no permitido";
    }
}

1 Respuesta

5votos

carlossevi Puntos63580

Creo que es menos complicado de lo que piensas. La clave está en la función move_uploaded_file(). Aquí su documentación. Uso:

bool move_uploaded_file ( string $filename , string $destination )

Parámetros:
$filename: nombre del fichero subido
$destination: ruta de destino

Debes sustituir lo siguiente:

Tu código:

move_uploaded_file($_FILES["archivo"]["tmp_name"], "archivos/" . $_FILES["archivo"]["name"]);

Cambiar por:

$extension = end(explode('.', $_FILES["archivo"]["tmp_name"]));
$nombrefichero = time();
move_uploaded_file($_FILES["archivo"]["tmp_name"], "archivos/" . $nombrefichero . $extension);

En el ejemplo he puesto un nombre de destino puramente basado en la fecha y hora para evitar duplicados, pero puedes hacer cualquier combinación.

0voto

nachito777sk comentado

Hola, me ha ido perfecto. He hecho lo siguiente:
en la condición para ver si existía el archivo, he quitado

echo $_FILES["archivo"]["name"] . " ya existe. ";

y he añadido tu código. Lo único que he tenido que modificar un par de cosillas:

$extension = end(explode('.', $_FILES["archivo"]["name"]));
$nombrefichero = time();
move_uploaded_file($_FILES["archivo"]["tmp_name"], "archivos/" . $nombrefichero. "." . $extension);

en $extensión no era tmp_name, era name, y faltaba el punto entre $nombrefichero y $extensión. Y además he dejado el else de la condición, de esta manera controla si el archivo existe, si existe le cambia el nombre por el de la fecha y lo sube, si no existe, lo sube directamente sin cambiarle el nombre.........
Muchísima gracias, me ha ido genial tu comentario.
Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta