viernes, 14 de diciembre de 2012

Subir archivos al servidor con PHP

El upload o subida de archivos al servidor mediante PHP es una tarea muy sencilla. Únicamente necesitamos un formulario HTML y manejar la matriz superglobal $_FILES. El formulario, que debe ser enviado utilizando el método POST, necesitará una entrada de carga de archivos de type file (type="file") con el que seleccionaremos el archivo a subir y un atributo para el tag form que indique al servidor que se va a adjuntar un archivo junto con el resto de información (enctype="multipart/form-data").

<form name="frm_upload" action="upload.php"
method="post" enctype="multipart/form-data">
<input type="file" name="archivo" />
</form>

Para procesar el archivo en el lado del servidor utilizaremos los siguientes elementos de la matriz $_FILES. Esta matriz toma el valor del atributo name del campo de tipo file como índice de su primera dimensión y almacena toda la información proporcionada por el archivo.

$_FILES['archivo']['tmp_name'] es la ruta temporal donde se ha guardado el archivo.
$_FILES['archivo']['name'] el nombre real del archivo en origen.
$_FILES['archivo']['size'] el tamaño del archivo en bytes.
$_FILES['archivo']['type'] tipo MIME del archivo subido al servidor.
$_FILES['archivo']['error'] código de error.

En el siguiente ejemplo cargamos un archivo en el servidor y si la operación tiene éxito informamos algunos detalles sobre el archivo subido.

//ruta donde colocaremos el archivo
$archivo = $_SERVER['DOCUMENT_ROOT'] . '/libro/18/uploads/' .
$_FILES['userfile']['name'];
//archivo temporal cargado en el servidor
$archivo_tmp = $_FILES['userfile']['tmp_name'];
$archivo_size = $_FILES['userfile']['size'];
$archivo_type = $_FILES['userfile']['type'];

if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
 if (!move_uploaded_file($archivo_tmp, $archivo)) {
  echo 'El archivo no ha podido ser ubicado en el directorio de destino.';
 } else {
  echo 'Archivo guardado correctamente.<br />';
  echo 'Ruta completa: ' . $archivo . '<br />';
  echo 'Tamaño archivo: ' . round($archivo_size / 1024, 2) . 'KB. <br />';
  echo 'Tipo: ' . $archivo_type . '<br />';
 }
}