Subir archivos con PHP y obtener link de descarga de archivo subido.

Hola, quería que en mi web se pudieran subir pequeños archivos (unos 50 Kb como maximo) comprimidos en .zip o .rar

Que puedan subirse desde un formulario ya lo he logrado, pero me interesaria hacer dos mejoras. La primera es saber si con HTML o PHP puedo obligar que solo puedan ser subidos archivos con extension .zip o .rar, impidiendo subir archivos .html o .doc por ejemplo

Y la segunda pregunta es que hay que hacer para obtener el enlace para descarga de un archivo subido. En mi formulario logro que aparezca una lista con todos los enlaces de todos los archivos subidos, pero la cosa se complica si ya se han subido mas de 20 archivos pues la lista se hace enorme y es complicado saber cual es el archivo que acabas de subir, por eso me interesaria que solo apareciera el ultimo archivo subido, para que tras subir el archivo, la persona pueda copiar dicho enlace y luego postearlo en el foro que quiera para que otros puedan descargarlo. ¿Es muy dificil?

Para obtener el listado de archivos subidos uso este codigo, lo dejo por si puede ayudar a ver que hay que retocar para que solo salga el ultimo archivo subido

	
	<?php 
	if ($gestor = opendir('upload')) {
		echo "<ul>";
	    while (false !== ($arch = readdir($gestor))) {
		   if ($arch != "." && $arch != "..") {
			   echo "<li><a href=\"upload/".$arch."\" class=\"linkli\">".$arch."</a></li>\n";
		   }
	    }
	    closedir($gestor);
		echo "</ul>";
	}
	?>	
Hola:

Para restringir la subida de archivos, utiliza la extensión Fileinfo de PHP o simplemente utiliza un if... else.

Para el otro problema, simplemente crea carpetas con los nombres de los usuarios, la IP o cualquier otro dato que los identifique. Luego a cada archivo le podrías poner la fecha o utilizar la base de datos para guardar la fecha y el enlace.

Saludos :P.
MMm, te refieres a ordenar los archivos por fecha de subida y mostrar solo el ultimo subido, no?

Voy a trastear a ver...
Mira, he encontrado este codigo gracias a google que practicamente hace lo que quiero

<? 
 
$nombre =  $_FILES['userfile']['name'];			//nombre con el que lo subió el usuario
$tipo =  $_FILES['userfile']['type'];			//tipo de archivo (jpg,gif,rar,txt,etc)
$tamano = $_FILES['userfile']['size'];			//tamaño del archivo en Kb; 1024Kb = 1Mb
$error = $_FILES['userfile']['error'];			//si apareció algún error en la subida
$nombre_temporal = $_FILES['userfile']['tmp_name'];	//Nombre temporal que se le asigna al archivo cuando sube a tu servidor
 
$nuevo_nombre = 'EL Archivo'
 
//Reviso que el archivo sea del tipo ZIP o RAR; y que pese menos de 5Mb
if (!((strpos($tipo, "rar") || strpos($tipo, "zip")) && ($tamano_archivo < 5120))) { 
   	echo "El tipo de archivo o el tamaño no es correcto.";
}else{ 
   	//Verifico que pueda mover el archivo y cambiarle el nombre. El archivo se guardará donde esta la pagina
	if (move_uploaded_file(FILES['userfile']['tmp_name'], $nuevo_nombre)){ 
      	 echo "El archivo subió!!."; 
   	}else{ 
      	 echo "Error al subir el archivo. Inténtelo nuevamente."; 
   	} 
} 
?>

Pero me falta una cosa, y es que en destino no se ha indicado ninguna carpeta por lo que el archivo subido deberia ir a public_html ¿verdad? Yo hago la prueba y a mi no me llega ningun archivo alli, y eso que he modificado los permisos de acceso.
¿Como tendria que modificar ese codigo para que el archivo subido llegara a una carpeta creada por mi llamada "upload"? Solo debe ser tocar la linea "move_uploaded_file(NombreArchivo, Destino)" pero el caso es que la modifico y tampoco logro nada.
Crea una carpeta llamada upload y dale permisos 777 (leer, escribir, ejecutar).
Claro, pero debes añadir la carpeta upload antes de $nuevo_nombre. La se crea en el servidor y no con PHP.
Si pero es eso justo lo que pregunto. ¿Como la añado? La pongo sin comillas ni comas ni nada, ¿asi?

 if (move_uploaded_file(FILES['userfile']['tmp_name'], upload $nuevo_nombre)){ 
           echo "El archivo subió!!."; 
       }else{ 
           echo "Error al subir el archivo. Inténtelo nuevamente."; 
       } 

La carpeta upload ya la tengo creada en el servidor y con los permisos en 777, lo que me falta añadir esto en el código para que suban allí los archivos
Así:

if (move_uploaded_file(FILES['userfile']['tmp_name'], "upload/$nuevo_nombre")){ 
           echo "El archivo subió!!."; 
       }else{ 
           echo "Error al subir el archivo. Inténtelo nuevamente."; 
       }
Con la función empty(). Revisa nuevamente el código que te di y verás como lo he utilizado :P.
Por cierto mira como va quedando!

Ya casi que solo me faltan los metodos de control del formulario!
Si, la he diseñado yo desde cero, usando Photoshop para algunas cosas y escribiendo línea a línea todo el código, gracias al curso de CCTW.
Hola de nuevo, skaparate, a ver si me puedes ayudar a acabar la web. En el subforo de formularios me han echado una mano para controlar la entrada de datos, pero he hecho una prueba y no me sale, asi que supongo que es que lo he insertado mal en el codigo.

http://www.comocreartuweb.com/consultas/showthread.php/56228-Metodo…

Me han pasado cosas de este tipo

spitfire2 escribió:ok:

//para que no envien vacios

$dato1=$_POST['dato1'];
$dato2=$_POST['dato2'];
$dato3=$_POST['dato3'];

if($dato1&$dato2&$dato3){echo"datos llenos, gracias";}else{echo"Datos vacios, rellenelos...............";}

//para que solo queden las letras y se borren los numeros
$datos=ereg_replace("[^A-Za-z]", "", $datos);

//para que solo queden los numeros y se borren las letras
$datos=ereg_replace("[^0-9]", "", $datos);

He probado esto

<?php
			
$host="xxxxxxx";
$database="xxxxxx";
$db_user="xxxxxxx";
$db_pass="xxxxxx";

//para que no envien vacios

$dato1=$_POST['dato1'];
$dato2=$_POST['dato2'];
$dato3=$_POST['dato3'];

if($dato1&$dato2&$dato3){echo"datos llenos, gracias";}else{echo"Datos vacios, rellenelos...............";}

// Conexión con el servidor
mysql_connect($host, $db_user, $db_pass) or die ("errorgrave".mysql_error());

// Selección de Base de Datos
mysql_select_db($database) or die ("errormuygrave".mysql_error());


?>

Pero no me ha servido. Le he dado a enviar y he podido enviar un formulario vacio
¿Es que tengo que colocar el codigo de control en otro lugar?

Tambien lo he probado aqui, pero tampoco me sirve. No hace nada, me sigue dejando enviar el formulario vacio

<?php


//para que no envien vacios

$dato1=$_POST['dato1'];
$dato2=$_POST['dato2'];
$dato3=$_POST['dato3'];

if($dato1&$dato2&$dato3){echo"datos llenos, gracias";}else{echo"Datos vacios, rellenelos...............";}

// Añadir un registro
mysql_query ("INSERT INTO `nombredatabase`.`table` (`dato1`,`dato2`,`dato3`) VALUES ('$_POST[dato1]','$_POST[dato2]','$_POST[dato3]')")

?>
He estado revisando tu codigo empty() pero me da error al usarlo en mi pagina

Tienes que mostrarnos el error XD.

solo se permitiera la introduccion de letras mayusculas

Sí se puede, pero esta mal planteado. Lo que des impedir es que se ingresen números y después convertir lo ingresado a mayúsculas con strtoupper( $nombre ); en PHP. Para permitir sólo letras, primero debes validar que sólo se ingresen letras:

$nombre = strtoupper( $nombre );

if( ! preg_match( '/[A-ZÑ]/', $nombre ) && strlen( $nombre ) != 3 ) {
  echo "Debes ingresar 3 letras; no se aceptan números.";
}

if( ! is_numeric( $puntaje ) ) {
  echo "Debes ingresar un puntaje numérico";
}
Warning: mysql_query() [
function.mysql-query
]: Access denied for user 'nobody'@'localhost' (using password: NO) in /home/bicheand/public_html/index.php on line 135

Warning: mysql_query() [
function.mysql-query
]: A link to the server could not be established in /home/bicheand/public_html/index.php on line 135

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/bicheand/public_html/index.php on line 137

Todos tienen que ver con que no se puede conectar a la base de datos. El error

Access denied for user 'nobody'@'localhost' (using password: NO) in /home/bicheand/public_html/index.php on line 135

es como escribir: mysql_connect( 'localhost', '', '' ); lo que no funcionará. En el fondo, el error esta en que alguna de las variables que le pasas a mysql_connect esta vacía.

Parse error: syntax error, unexpected '}' on line 37

que seria esta

} else {

Te falta un punto y coma (;) XD; a ver si lo encuentras.