Nueva pregunta

Pregunta:

Fecha: 19-05-2017 20:40:46 (En Español)

Ejemplo: subir archivos con PHP[Resuelta]

Hola, quería compartirles un pequeño script para subir archivos con php. Es un ejemplo básico, pero muy útil (de hecho actualmente lo utilizo, sólo que lo he orientado a objetos).

<?php
$err_msg = array(
    UPLOAD_ERR_OK => 'Archivo subido correctamente.',
    UPLOAD_ERR_INI_SIZE => 'El tamaño del archivo ha excedido el tamaño indicado en php.ini .',
    UPLOAD_ERR_FORM_SIZE => 'El tamaño del archivo ha excedido el tamaño máximo para este formulario.',
    UPLOAD_ERR_PARTIAL => 'El archivo ha sido subido parcialmente.',
    UPLOAD_ERR_NO_FILE => 'El archivo no existe.',
    UPLOAD_ERR_NO_TMP_DIR => 'El directorio temporal no existe.',
    UPLOAD_ERR_CANT_WRITE => 'No se puede escribir en el disco.',
    UPLOAD_ERR_EXTENSION => 'Error de extensión PHP.'
);
$tipos_permitidos = array('jpg', 'jpeg', 'png', 'pdf'); //modificar estensiones

if (isset($_POST["submit"])) {
    $fecha = date('d-m-Y', time());

    $nombre_temp = $_FILES["file_upload"]["tmp_name"];
    $nuevo_nombre = $_FILES["file_upload"]["name"];
    $primer_caracter = strtoupper(substr($nuevo_nombre, 0, 1));
    $destino = "uploads/carpeta_" . $primer_caracter . "-$fecha/" . basename($nuevo_nombre);


    if (!file_exists("uploads/carpeta_" . $primer_caracter . "-" . $fecha)) {
        mkdir("uploads/carpeta_" . $primer_caracter . "-" . $fecha);
    }

    if (move_uploaded_file($nombre_temp, $destino)) {
        $mensaje = "Archivo correctamente subido";

        $mime = explode(".", $nuevo_nombre);
        $count = count($mime);
        $count--;

        $a = in_array($mime[$count], $tipos_permitidos) ? TRUE : FALSE;
        if (!$a) {
            echo "Tipo de archivo no permitido";
            exit();
        }
    } else {
        $msg = $err_msg[$_FILES['file_upload']['error']];
        echo '<span>' . $msg . '</span>';
    }
}
?>
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Formulario para subir archivos</title>
    </head>

    <body>
        <h1>Seleccionar un archivo</h1>
        <?php
        if (isset($mensaje)) {
            echo $mensaje . "<br>";
        }
        ?>
        <form action="index.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
            <input type="file" name="file_upload"><br><br>
            <input type="submit" name="submit" value="SubirArchivo">
        </form>
    </body>
</html>


Espero que les sea útil.

Cualquier crítica/sugerencia es bienvenida.

Saludos!
Etiquetas: $_POST - Aporte - HTML - PHP - Subir Archivos (Upload) Votos: 4 - Respuestas: 5 - Vistas: 40 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 20-05-2017 16:04:33 Esteban muchas gracias por compartir tu codigo en la comunidad.
    De seguro que será de utilidad para muchos integrantes.

    Estaré atento a tu proximo aporte ;)

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 20-05-2017 18:27:15 Hola Estaban, muchas gracias por compartir tu código, aprovecho para hacerte mi aporte.

    Validación MAX_FILE_SIZE del lado del servidor: veo que haz incluido el input type hidden para realizar una falla temprana ante el upload de un archivo superior a los 2000000 bytes (2MB), eso esta muy bien, pero no veo una validación del lado del servidor. Transcribo una observación de la documentación oficial de PHP: ...El campo oculto MAX_FILE_SIZE (medido en bytes) debe preceder al campo de entrada del fichero, siendo su valor el tamaño de fichero máximo aceptado por PHP. Se debe utilizar siempre este elemento del formulario, ya que evita a los usuarios la molestia de esperar a que un fichero grande sea transferido sólo para descubrir que falló la transferencia porque era demasiado grande. Hay que tener en cuenta que engañar a esta configuración en el lado del navegador es muy fácil; nunca dependa de que los ficheros que tengan un tamaño mayor sean bloqueados por esta característica. Es simplemente una característica conventiene para los usuarios en el lado cliente de la aplicación. No obstante, la configuración de PHP (en el lado del servidor) para un tamaño máximo no puede ser engañada...
    Habiendo citado dicho fragmento, solo me resta decir que puedes validar el tamaño valiendote de $_FILES['file_upload']['size'], que devolverá el tamaño en bytes del archivo subido.

    Verificación del tipo de archivo: esta muy bien que valides el tipo de archivo, pero aquí hay algunas consideraciones, como no confiar en la extensión del archivo suministrada por el usuario (o sea, su nombre), y por otra parte tener en cuenta la documentación oficial de PHP que nos advierte sobre la clave 'type': ...Se podría utilizar la variable $_FILES['fichero_usuario']['type'] para descartar cualquier fichero que no corresponda con un cierto criterio de tipo, aunque esto se debe emplear solo como la primera de una serie de comprobaciones debido a que este valor está completamente bajo el control del cliente y no se comprueba en el lado de PHP...
    Podrías utilizar la función mime_content_type() pero esta marcada como obsoleta (aunque disponible en php7).
    Lo correcto sería utilizar la clase finfo(), la cual carece (a mi gusto) de ejemplos claros, aquí te dejo un ejemplo de como obtener el mime type de una forma segura:
    $objetoFinfo = new finfo(FILEINFO_MIME);
    $mimeType  = $objetoFinfo->file($nombre_temp); //$nombre_temp se corresponde con la ruta del archivo subido.
    

    Por último deberías ejecutar la validación del tipo (el in_array, if y exit) antes de invocar a la función move_uploaded_file, sino por más que el archivo no sea valido estarás realizando su upload.

    Nuevamente muchas gracias por compartir tu código, espero que mi aporte te sea de ayuda para mejorarlo.

    Saludos a todos y como siempre buen código!
      Votos: 3 - Link respuesta
     
  • Fecha: 21-05-2017 02:48:34 muchas gracias, especialmente a Fernando Mosquera por las recomendaciones, las tendré en cuenta la próxima vez que deba trabajar con archivos!
    saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 22-05-2017 03:14:03 Hola, muchas gracias por compartir el código!   Votos: 0 - Link respuesta
     
  • Fecha: 22-05-2017 18:12:49 Para los que utilizan Laravel, aquí hay una explicación de cómo subir archivos

    Cómo subir archivos con Laravel


      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com