Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

Subiendo archivos a nuestro servidor con PHP

En esta entrada veremos como tema el subir una archivo a nuestro servidor a través de PHP y que tenemos que tener en cuenta para lograrlo.

contenido:

Introducción

Si hay algo que hay que tocar tarde o temprano es la suba de archivos a nuestro servidor otra fuente donde podamos usarlos. En este apartado veremos como hacer esto con PHP.

Para esto antes hagamos un pequeño formulario para subir un archivo. El siguiente ejemplo está hecho con purecss.

Formulario con enctype=»multipart/form-data»

formulario
<html>
  <head>
    <title>Upload file with php</title>
    <link rel="stylesheet" href="cdnjs.cloudflare.com/ajax/libs/pure/1.0.1/pure-min.css" type="text/css">
    <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.1/build/forms-min.css" type="text/css">
  </head>
  <body>
    <h1>upload files with php</h1>
    <h2>This is a fileupload example</h2>
    <form class="pure-form pure-form-aligned" enctype="multipart/form-data" action="upload.php" method="post">
        <fieldset>
            <div class="pure-control-group">
                <label for="name">Filename</label>
                <input id="name" name="name" type="text" placeholder="ex: casa" required>
            </div>

            <div class="pure-control-group">
                <label for="file">File: </label>
                <input id="file" name="uploaded_file" type="file" placeholder="file" required>
            </div>


            <div class="pure-controls">
                <button type="submit" class="pure-button pure-button-primary">Submit</button>
            </div>
        </fieldset>
    </form>
  </body>
</html>

Tome en cuenta que se escribió enctype="multipart/form-data" en el form sin este atributo el $_FILE no funcionara nos dará un array vacío.

Contenido de la variable $_FILE

La variable global $_FILE contiene toda la información del archivo que va a ser subido al servidor. Tenga en cuenta que en las siguientes explicaciones usaré el nombre x solo por sencillez, pero puede ser cualquier nombre en mi caso debido al formulario debería usar el nombre file.

$_FILES['x']['name'] es el nombre original del archivo en la máquina del cliente

$_FILES['x']['type'] el mime type del archivo, si el navegador brinda esta información.

$_FILES['x']['size'] el tamaño en bytes

$_FILES['x']['tmp_name'] el nombre que tendrá el archivo cuando se suba al servidor.

$_FILES['x']['error'] contiene un código de error asociado con el archivo a subir. A continuación la lista de dicho código.

  • UPLOAD_ERR_OK = 0 – Este valor(UPLOAD_ERR_OK o 0) se da cuando no hay ningun error y se pudo hacer el upload con exito
  • UPLOAD_ERR_INI_SIZE = 1 – el archivo subido excede el valor de upload_max_filesize directive en php.ini.
  • UPLOAD_ERR_FORM_SIZE = 2 – Se da cuando excede el valor especificado en MAX_FILE_SIZE en el formulario HTML.
  • UPLOAD_ERR_PARTIAL = 3 – El archivo subido solo se ha subido parcialmente.
  • UPLOAD_ERR_NO_FILE = 4 – No se subio por alguna razón
  • UPLOAD_ERR_NO_TMP_DIR = 6– no hay una carpeta temporal. Introduced in PHP 5.0.3.
  • UPLOAD_ERR_CANT_WRITE = 7 – Fallo la escritura en disco. Introduced in PHP 5.1.0.
  • UPLOAD_ERR_EXTENSION = 8 – Una extensión de PHP paro la subida del archivo. Introduced in PHP 5.2.0.

Es hora de utilizar esto, primero que nada chequear el tamaño del archivo y luego si hubo algún error.

checkerrors function que ira en upload.php
private function checkerrors($error)
    {
        switch ($error) {
            case UPLOAD_ERR_OK:
                return array(true,"file was upload succesfully");
                break;
            case UPLOAD_ERR_INI_SIZE:
                return array(false,"an error occurs: size error");
                break;
            case UPLOAD_ERR_FORM_SIZE:
                return array(false,"an error occurs: do not size specified form values");
                break;
            case UPLOAD_ERR_PARTIAL:
                return array(false,"an error occurs: file is partialy uplaoded ");
                break;
            case UPLOAD_ERR_NO_FILE:
                return array(false,"an error occurs: file does not uploaded");
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                return array(false,"an error occurs: no tmp file directory ");
                break;
            case UPLOAD_ERR_CANT_WRITE:
                return array(false,"an error occurs: cant write check file permissons ");
                break;
            case UPLOAD_ERR_EXTENSION:
                return array(false,"an error occurs: PHP extension denied it");
                break;
        }
    }

En caso de que error no de ningún mensaje, el archivo estaría subido temporalmente a nuestro servidor.

Usando la función move_upload_file para guardar nuestro archivo

la sintaxis de move_upload_file es la siguiente:

Sintaxis
 move_uploaded_file ( string $filename , string $destination ) : bool

Donde $filename – seria el nombre del archivo a mover en nuestro caso es el $_FILES["uploaded_file"]['tmp_name'] que será movido a la carpeta /var/www/html/upload_con_php/x/ tome en cuenta que en $destination también va el nombre del archivo, en si nos quedaría /var/www/html/upload_con_php/x/archivo.extensión.

Así me quedaría mi archivo upload.php

update.php
<?php
error_reporting(E_ALL);
      ini_set("display_errors", 1);
      /*
      echo $_FILES["uploaded_file"]['name']."</br>";
      echo $_FILES["uploaded_file"]['type']."</br>";
      echo $_FILES["uploaded_file"]['size']."</br>" ;
      echo $_FILES["uploaded_file"]['tmp_name']."</br>";
      */
      $error = checkerrors($_FILES["uploaded_file"]['error']);
      //echo var_dump($_FILES);
      if($error[0]){
        $is_uploaded = move_uploaded_file($_FILES["uploaded_file"]['tmp_name'],"/var/www/html/upload_con_php/x/".basename($_FILES["uploaded_file"]['name']));
        if($is_uploaded):
            echo "el archivo fue subido con exito";
        else:
            echo "el archivo no a podido ser subido ";
        endif;
      }else{
          echo $error[1];
      }

      function checkerrors($error)
      {
          switch ($error) {
              case UPLOAD_ERR_OK:
                  return array(true,"file was upload succesfully");
                  break;
              case UPLOAD_ERR_INI_SIZE:
                  return array(false,"an error occurs: size error");
                  break;
              case UPLOAD_ERR_FORM_SIZE:
                  return array(false,"an error occurs: do not size specified form values");
                  break;
              case UPLOAD_ERR_PARTIAL:
                  return array(false,"an error occurs: file is partialy uplaoded ");
                  break;
              case UPLOAD_ERR_NO_FILE:
                  return array(false,"an error occurs: file does not uploaded");
                  break;
              case UPLOAD_ERR_NO_TMP_DIR:
                  return array(false,"an error occurs: no tmp file directory ");
                  break;
              case UPLOAD_ERR_CANT_WRITE:
                  return array(false,"an error occurs: cant write check file permissons ");
                  break;
              case UPLOAD_ERR_EXTENSION:
                  return array(false,"an error occurs: PHP extension denied it");
                  break;
          }
      }
?>

Por Último tome en cuenta que usamos la función basename esta solo nos devolverá el último componente de la ruta que le pasemos.

Si deseas descargar el ejemplo a tu computadora puedes descargarlo atrevés de github en el siguiente link 👇

Descargar repo en github
Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category