Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Subir archivos y evitar duplicados en el servidor

Estas en el tema de Subir archivos y evitar duplicados en el servidor en el foro de PHP en Foros del Web. Saludos, espero me puedan ayudar. Mi duda es la siguiente: Estoy subiendo archivos .pdf a una carpeta del servidor (1 a la vez), he comprobado ...
  #1 (permalink)  
Antiguo 01/01/2016, 22:39
 
Fecha de Ingreso: enero-2016
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 1
Busqueda Subir archivos y evitar duplicados en el servidor

Saludos, espero me puedan ayudar. Mi duda es la siguiente:

Estoy subiendo archivos .pdf a una carpeta del servidor (1 a la vez), he comprobado que al momento de subir archivos con nombres idénticos estos se reemplazan y solo permanece el ultimo subido.

Como puedo evitar esto y mantener ambos archivos en el servidor.

Existe alguna manera de renombrarlos solo al momento de guardar?. Estuve investigando algo sobre agregarles id unicos, pero no me quedo muy claro.

Este es el codigo que utilizo para subir los archivos.

Código:
# definimos la carpeta destino
    $carpetaDestino="actas/";
 # si hay algun archivo que subir
    if($_FILES["archivo"]["name"][0])
    {
        # recorremos todos los arhivos que se han subido
        for($i=0;$i<count($_FILES["archivo"]["name"]);$i++)
        {
       if ($_FILES["archivo"]["type"][$i] <= 1000000)
	{
           # si es un formato de imagen
           if($_FILES["archivo"]["type"][$i]=="application/pdf")
          {
           # si exsite la carpeta o se ha creado
         if(file_exists($carpetaDestino) || @mkdir($carpetaDestino))
            {
        $origen=$_FILES["archivo"]["tmp_name"][$i];
        $destino=$carpetaDestino.$_FILES["archivo"]["name"][$i];
	# SI YA EXISTE UN ARCHIVO PRIMERO LO BORRAMOS
		
	mysql_select_db($database_prueba, $prueba);
	$query_Recordset2 = "
       SELECT actas_convocatoriaruta FROM actas_areasacademicas WHERE actasid='".$_GET['actasid']."'"; 
      	$Recordset2 = mysql_query($query_Recordset2, $prueba) or die(mysql_error());
       $row_Recordset2 = mysql_fetch_assoc($Recordset2);
	$totalRows_Recordset2 = mysql_num_rows($Recordset2); 
	$ruta = $row_Recordset2['actas_convocatoriaruta'];
	if  (isset($ruta))
	{
         	unlink($ruta);
	}
	# movemos el archivo
            if(@move_uploaded_file($origen, $destino))
              {
                //Envio de informacion via mail
              }else{
            echo "<br>No se ha podido mover el archivo: ".$_FILES["archivo"]["name"][$i];
              }
                 }else{
                  echo "<br>No se ha podido crear la carpeta: up/".$user;
                     }
                }else{
               ?> 
                	<script> 
	               window.alert("Solo se permite archivos .pdf y el tamaño no debe exeder 1MB"); 
                  	//location.href = "../permisosrecibidosleidos.php";
                      //window.location="../subirconvocatorias.php"; 
	            	</script> 
	        <?php
                                  }
                              	}
	                      }
Espero contar con su ayuda. Gracias
  #2 (permalink)  
Antiguo 01/01/2016, 23:29
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 4 meses
Puntos: 39
Respuesta: Subir archivos y evitar duplicados en el servidor

Se me ocurre que, si al mismo momento solo se puede subir una. Pues al "name" del archivo le concatenes algo que lo haga diferente, por ejemplo la hora y la fecha en que se subió, esto puedes hacerlo así
Código PHP:
Ver original
  1. $nombrearchivo = $_POST["name"]; //por ejemplo
  2. $diferenciador = date("dhms"); //obtengo el día, la hora, el minuto y el segundo actual

y luego pones

Código PHP:
Ver original
  1. $nombre_definitivo = $nombrearchivo . $nombrediferenciador;

Si en todo caso se subieran más de un archivo al mismo tiempo, con un for y concatenando lo anterior con la variable usada en el for al nombre del archivo te bastaría :D
  #3 (permalink)  
Antiguo 02/01/2016, 15:12
 
Fecha de Ingreso: enero-2016
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 1
Respuesta: Subir archivos y evitar duplicados en el servidor

Muchas gracias por tu respuesta.

He logrado concatenar al "name" del archivo algo que lo haga diferente.

Ahora, además de guardar el archivo en el servidor, también guardo la url del archivo en una tabla de mi base de datos para que los usuarios puedan acceder y descargarse dicho archivo.

Necesito que los usuario se descargen los archivos con el nombre original que ellos subieron. (Sin concatenar nada)

Este es el código que utilizo para descargar los archivos. Hago un select al campo que contiene la ruta del archivo para poder manejarlo, pero obtengo el nombre concatenado y deseo el original.

Código PHP:

Código PHP:
Ver original
  1. $actasid = $_GET['actasid'];
  2.         mysql_select_db($database_prueba, $prueba);
  3.     $query_Recordset1 = "SELECT actas_convocatoriaruta FROM actas_areasacademicas               WHERE actasid ='".$actasid."'";
  4.     $Recordset1 = mysql_query($query_Recordset1, $prueba) or die(mysql_error());
  5.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  6.     $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  7.  
  8.               $archivo = basename($row_Recordset1['actas_convocatoriaruta']);
  9.  
  10.         $ruta = '../actas/'.$archivo;
  11.  
  12.         if (is_file($ruta))
  13.         {
  14.            header('Content-Type: application/force-download');
  15.            header('Content-Disposition: attachment; filename='.$archivo);
  16.            header('Content-Transfer-Encoding: binary');
  17.            header('Content-Length: '.filesize($ruta));
  18.  
  19.            readfile($ruta);
  20.         }
  21.         else
  22.          ?>
  23.                     <script>
  24.             window.alert("Aún no se ha subido la convocatoria");
  25.             //location.href = "../permisosrecibidosleidos.php";
  26.             window.history.back();
  27.             </script>
  28.             <?php

Como puedo dar solución a este problema.

Espero contar con su ayuda. Gracias
  #4 (permalink)  
Antiguo 02/01/2016, 17:17
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 4 meses
Puntos: 39
Respuesta: Subir archivos y evitar duplicados en el servidor

Puedes crear un campo en la Base de Datos para que ahí recibas el nombre del archivo original subido por el usuario.

En el archivo que tienes para descargar el archivo, haces una consulta buscando ese nombre 'original', en esta linea

Código PHP:
Ver original
  1. header('Content-Disposition: attachment; filename='.$archivo);

Cambia el '$archivo' por la variable que almacenes de la consulta, me explico?

Otra forma es, si sabes con exactitud y con seguridad que lo que le agregas al archivo para hacerlo diferente tendrá siempre la misma cantidad de caracteres.
Puedes hacer uso de http://php.net/manual/es/function.substr.php y eliminar la cantidad de caracteres antes de darle el filename, así ya no tendrías que hacer uso de la base de datos para el nombre del archivo original :)

A ver si me expliqué jajaja
  #5 (permalink)  
Antiguo 02/01/2016, 17:29
 
Fecha de Ingreso: enero-2016
Mensajes: 14
Antigüedad: 8 años, 3 meses
Puntos: 1
Respuesta: Subir archivos y evitar duplicados en el servidor

Muchas gracias por tu ayuda

Efectivamente utilice la segunda forma con la función substr


Código PHP:
$cadena $archivo
        
$subcadena "-"
        
// localicamos en que posición se haya la $subcadena
        
$posicionsubcadena strpos ($cadena$subcadena); 
        
// eliminamos los caracteres desde $subcadena hacia la izq, y le sumamos 1 para borrar tambien el $subcadena en este caso
        
$nombrefinal substr ($cadena, ($posicionsubcadena+1)); 
De esta manera logro recuperar el nombre original del archivo.

Gracias por tu ayuda. Saludos

Etiquetas: duplicados, mysql, select, servidor, sql
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 21:06.