lunes, 30 de enero de 2017

Php subir archivos de imagen

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.