Tema: FAQ's de PHP
Ver Mensaje Individual
  #12 (permalink)  
Antiguo 20/11/2002, 15:33
Avatar de GhostRider
GhostRider
 
Fecha de Ingreso: julio-2001
Ubicación: en mi propio infierno
Mensajes: 248
Antigüedad: 16 años, 5 meses
Puntos: 0
Tema: Archivos
Pregunta: ¿Cómo puedo subir archivos a través de un formulario?
Respuesta: Con el siguiente ejemplo.

Código PHP:
<?php
if (isset($_POST['submit'])) { 
    if(
is_uploaded_file($_FILES['fichero']['tmp_name'])) { // verifica haya sido cargado el archivo
        
if(move_uploaded_file($_FILES['fichero']['tmp_name'], $_FILES['fichero']['name'])) { // se coloca en su lugar final
                    
echo "<b>Upload exitoso!. Datos:</b><br>";
            echo 
"Nombre: <i><a href=\"".$_FILES['fichero']['name']."\">".$_FILES['fichero']['name']."</a></i><br>";
            echo 
"Tipo MIME: <i>".$_FILES['fichero']['type']."</i><br>";
                    echo 
"Peso: <i>".$_FILES['fichero']['size']." bytes</i><br>";
                        echo 
"<br><hr><br>";
        }
    }

// A continuación el formulario
}
?>

<form action="<?php echo $_SERVER['PHP_SELF'?>" method="post" enctype="multipart/form-data">
    Archivo: <input name="fichero" type="file">
    <input name="submit" type="submit" value="Upload!"> 
</form>
Funciona de la siguiente manera:

El código sube un archivo via HTTP POST, este se guarda automaticamente con un nombre y en una carpeta temporales del servidor mientras corre el codigo, despues el mismo servidor lo borra (por seguridad). La función is_uploaded_file() verifica que este procedimiento haya sido exitoso. Posteriormente el archivo es movido a su posición final con la función move_uploaded_file().


Notas:
  • Es necesario el atributo enctype="multipart/form-data" del formulario, es lo que indica que se están enviando archivos.
  • El primer key de $_FILES corresponde al name del filebox; En el ejemplo "fichero".
  • Si se quiere condicionar la carga del archivo según su peso y/o tipo se deberá hacer a través de los datos arrojados por la variable superglobal $_FILES antes de colocarlo en su posición final. Por ejemplo:
Código PHP:
If(is_uploaded_file($_FILE['fichero']['tmp_file']) {
    If(
$_FILES['fichero']['type']=="image/jpeg") {
        
// Proseguimos solo si se trata de un JPG
        
move_uploaded_file("...etc..."); 
    } else echo 
"El archivo no es una imágen JPG";
// bien puede condicionarse $_FILES['fichero']['size'] > XXXX
// donde 'XXXX' es un número entero representando los bytes máximos del archivo 
  • Listas de los MIME TYPE hay muchas en internet. Una muy completa se encuentra en webmaster-toolkit
  • En el ejemplo el archivo es guardado en la misma carpeta, si se quiere modicar esto ha de cambiarse el parámetro correspondiente de la función move_uploaded_file(). Por ejemplo:
Código PHP:
$ruta"carpeta/".$_FILES['fichero']['name']; // Se guardaría dentro de "carpeta" con el nombre original
// $ruta= "carpeta/nuevo_nombre.jpg"; si también se quiere renombrar
move_uploaded_file($_FILES['fichero']['tmp_name'], $ruta);

// Puede guardarse $ruta en una Base de Datos para su uso posterior 
  • El ejemplo funciona con versiones PHP 4.1.x ó superior y con register_globals en OFF.
  • La carga de archivos es dependiente de la configuración del servidor: disponer de permisos, no exeder el tamaño límite, el nombre de la carpeta personal, etc.
  • Para detalles lease la documentación oficial: www.php.net/features.file-upload

Espero les sea de utilidad.

Última edición por jam1138; 10/10/2005 a las 05:54 Razón: Actualización/Ampliación