Hola amigos hoy vamos a ver cómo subir un archivo de imagen a nuestro servidor usando php.
Explicaré paso a paso todo el proceso, validación y retorno de errores.
// Primero escribimos el encabezado html.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Subir imagen</title>
</head>
<body>
// Abrimos código php
<?php
/* Comenzamos por crear una lógica para el script, si nos pasa $_POST['oculto'] valida el formulario, si hay errores nos los pasa y si no hay errores procesa el formulario, si no pasa nada de esto vemos el formulario. */
if($_POST['oculto']){
if($form_errors = validate_form()){
show_form($form_errors);
} else {
process_form();
}
} else {
show_form();
}
////////////////////////////
/* Creamos la función de validación que nos devuelve los errores */
function validate_form(){
$errors = array();
$limite = 500 * 1024;
/* Al leer el código observamos como permitimos unas extensiones y tipos de archivo y comprobamos si son correctas. */
$ext_permitidas = array('jpg','JPG','gif','GIF','png','PNG','bmp','BMP');
$extension = substr($_FILES['myimg']['name'],-3);
/* La siguiente fucnión está comentada pues en alguna versión php no funciona, la sustituyo por la anterios linea.. */
// $extension = end(explode('.', $_FILES['myimg']['name']) );
$ext_correcta = in_array($extension, $ext_permitidas);
$tipo_correcto = preg_match('/^image\/(gif|png|jpg|bmp)$/', $_FILES['myimg']['type']);
// Comprobamos que se ha seleccionado un archivo.
if($_FILES['myimg']['size'] == 0){
$errors [] = "Ha de seleccionar un archivo.";
}
elseif(!$ext_correcta){
$errors [] = "La extension no esta admitida: ".$_FILES['myimg']['name'];
}
elseif(!$tipo_correcto){
$errors [] = "Este tipo de archivo no esta admitido: ".$_FILES['myimg']['name'];
}
// Limitamos el tamaño del archivo.
elseif ($_FILES['myimg']['size'] > $limite){
$tamanho = $_FILES['myimg']['size'] / 1024;
$errors [] = "El archivo".$_FILES['myimg']['name']." es mayor de 500 KBytes. ".$tamanho." KB";
}
// Comprobamos los errores de carga.
elseif ($_FILES['myimg']['error'] == UPLOAD_ERR_PARTIAL){
$errors [] = "La carga del archivo se ha interrumpido.";
}
elseif ($_FILES['myimg']['error'] == UPLOAD_ERR_NO_FILE){
$errors [] = "Es archivo no se ha cargado.";
}
/* Nos devuelve los errores a la fución function show_form($errors='') */
return $errors;
}
////////////////////////////
/* Creamos la función que procesa el formulario. */
function process_form(){
$safe_filename = trim(str_replace('/', '', $_FILES['myimg']['name']));
$safe_filename = trim(str_replace('..', '', $safe_filename));
$nombre = $_FILES['myimg']['name'];
$nombre_tmp = $_FILES['myimg']['tmp_name'];
$tipo = $_FILES['myimg']['type'];
$tamano = $_FILES['myimg']['size'];
$destination_file = 'img_admin/'.$safe_filename;
print("<table align='center'>
<tr>
<th colspan=2 style='color:green' align='center'>
Archivo seleccionado.
</th>
</tr>
<tr>
<td style='color:Blue' width='200px'>
Archivo seleccionado:
</td>
<td>"
.$safe_filename.
"</td>
</tr>
</table>
</br></br>");
if( file_exists( 'img_admin/'.$nombre) ){
print("El archivo ya existe: ".$nombre.". Seleccione otra imagen."
);
}
elseif (move_uploaded_file($_FILES['myimg']['tmp_name'], $destination_file)){
print("El archivo se ha guardado en: ".$destination_file);
}
else {
print("No se ha podido guardar el archivo en el direcctorio img_admin/");
}
show_form();
}
////////////////////////////
/* Creamos la función que nos muestra el formulario, con errores si los hay. */
function show_form($errors=''){
if ($_POST['oculto']){$defaults = $_POST;
} else {$defaults = array('myimg' => $_POST['myimg']);}
$color = array('yellow','white');
if($errors){print("<div width='90%' style='float:left'>
<table border=0 align='left' style='border:none'>
<tr><th>
<font color='red' size=4px><b>Solucione estos errores</b></font>
</th></tr>");
for($a=0, $ci=0; $c=count($errors), $a<$c; $a++, $ci=1-$ci){
print("<tr bgcolor=\"".$color[$ci]."\">
<td align='center'>"
.$errors[$a].
"</td></tr>");
}
print("</table></div>
<div style='clear:both'></div>");
}
/* Hemos de acordarnos que para trabajar con archivos el formulario siemtpre ha de tener enctype='multipart/form-data' de lo contrario no funcionará. */
print("<form name='form1' method='post' action='$_SERVER[PHP_SELF]' enctype='multipart/form-data'>
<table border=0 align='center'>
<tr><th colspan=2 style='color:green'>
Upload archivo.
</th></tr>
<tr><td style='color:blue' width='150px'>
Seleccione el archivo:
</td><td>
<input type='file' name='myimg' value='".$defaults['myimg']."' />
</td></tr>");
botones_form();
print("</table> <!-- Fin de la tabla -->
</form> <!-- Fin del formulario -->");
}
////////////////////////////
/* He creado una función para los botones del formulario. Pero lo podeís hacer de otra manera. */
function botones_form(){
print("<tr align='center'>
<td colspan=2 style=\"padding-top:24px\">
<input type='submit' value='Upload Archivo' />
<!-- Utilizamos el campo hidden para procesar el formulario -->
<input type='hidden' name='oculto' value=1 />
</td>
</tr>");
}
////////////////////////////
/* Y por último cerramos php y html. */
?>
</body>
</html>
No hay comentarios:
Publicar un comentario
Gracias por vuestros aportes.