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
- Formulario con
enctype="multipart/form-data"
- Contenido de la variable
$_FILE
- Usando la función move_upload_file para guardar nuestro archivo
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»
<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 exitoUPLOAD_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ónUPLOAD_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.phpprivate 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:
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- Anterior: creando un directorio con php
- Siguiente: creando archivos con PHP