También es siempre buena idea controlar el código de error que devuelve el servidor cuando se suben archivos.
El array $_FILES incluye un campo que contiene el número de error que se encontró:
Código PHP :
$error_code = $_FILES['archivo']['error'];
Si $error_code es igual a cero, no hubo problemas y solo en ese caso debería intentarse mover el archivo temporal al directorio final, caso contrarios se debería mostrar un mensaje apropiado.
Usando el código de
tuadmin (que por lo demás es correcto):
Código PHP :
<?php /* Función que traduce el código de error a su mensaje correspondiente. (Los mensajes deberían estar en UTF-8). */
function FileUploadErrorMsg($error_code) {
switch ($error_code) {
case UPLOAD_ERR_INI_SIZE:
return $error_code." El archivo es más grande que lo permitido por el Servidor.";
case UPLOAD_ERR_FORM_SIZE:
return $error_code." El archivo subido es demasiado grande.";
case UPLOAD_ERR_PARTIAL:
return $error_code." El archivo subido no se terminó de cargar (probablemente cancelado por el usuario).";
case UPLOAD_ERR_NO_FILE:
return $error_code." No se subió ningún archivo";
case UPLOAD_ERR_NO_TMP_DIR:
return $error_code." Error del servidor: Falta el directorio temporal.";
case UPLOAD_ERR_CANT_WRITE:
return $error_code." Error del servidor: Error de escritura en disco";
case UPLOAD_ERR_EXTENSION:
return $error_code." Error del servidor: Subida detenida por la extención";
default:
return "Error del servidor: ".$error_code;
}
} // FileUploadErrorMsg;
//lsa varibales de formulario se recuperan por _POST o _GET depende del formulario
//if($_POST['boton'])
//eso te producira un error del tipo E_NOTICE por que esa variable no existe,
//aun asi que verificamos primero la existencia con isset
if(isset($_POST['boton'])) {
$msgerr = "";
$error_code = $_FILES['archivo']['error'];
if ($error_code == 0) {
if (is_uploaded_file($_FILES['archivo']['tmp_name'])) {
//deberias declarar la ruta donde se copiara el archivo
copy($_FILES['archivo']['tmp_name'], $_FILES['archivo']['name']);
//si realmente copio baria que verificarlo
if(file_exists($_FILES['archivo']['name'])) {
$msgerr = "se copio el archivo en el siguiente destino:" . realpath($_FILES['archivo']['name']);
} else {
$msgerr = "El archivo no se pudo mover al directorio final.";
}
} else {
$msgerr = "El archivo no existe en los temporarios.";
}
} else {
$msgerr = FileUploadErrorMsg($error_code);
}
echo $msgerr;
die();
}
?>
<form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data" name="form1">
<p align="center">Archivo
<input name="archivo" type="file" id="archivo">
</p>
<p align="center">
<input name="boton" type="submit" id="boton" value="Enviar">
</p>
</form>
Otras cosas que se podrían hacer para mejorar la seguridad es controlar que no te suban cualquier cosa. Tal como está el código, es fácil subir un archivo .php y luego ejecutarlo. Imagina las consecuencias de eso