En esta entrada, explicaremos un sencillo código para guardar imágenes o archivos en el servidor con PHP, lo que suele ser una funcionalidad muy recurrente en sitios web donde se requiere cargar información.
Vamos al código
suponiendo que tenemos dos archivos y una carpeta
- index.php: donde estará nuestro formulario, HTML y lo que visualiza el cliente
- upload-file.php: donde estará nuestra lógica del lado del servidor.
- /files: carpeta en donde cargaremos nuestros archivos, nuestro código puede generarla si no existe
Primero creamos nuestro formulario en el index.php para cargar nuestros archivos, OJO con las etiquetas del formulario:
<form action="upload-file.php" method="post" enctype="multipart/form-data">
<label for="fileTest">Selecciona una imagen/archivo:</label>
<input id="fileTest" name="fileTest" type="file">
<button type="submit">Guardar</button>
</form>
action="upload-file.php" :
Apuntamos la acción de nuestro formulario al archivo upload-file.php (o a donde tengamos nuestro método de guardado)method="post"
enctype="multipart/form-data" :
Siempre que enviemos archivos en un formulario seleccionamos este Enctype
Ahora vamos al archivo upload-file.php
<?php
$file = $_FILES["fileTest"]["name"]; //Nombre de nuestro archivo
$url_temp = $_FILES["fileTest"]["tmp_name"]; //Ruta temporal a donde se carga el archivo
//dirname(__FILE__) nos otorga la ruta absoluta hasta el archivo en ejecución
$url_insert = dirname(__FILE__) . "/files"; //Carpeta donde subiremos nuestros archivos
//Ruta donde se guardara el archivo, usamos str_replace para reemplazar los "\" por "/"
$url_target = str_replace('\\', '/', $url_insert) . '/' . $file;
//Si la carpeta no existe, la creamos
if (!file_exists($url_insert)) {
mkdir($url_insert, 0777, true);
};
//movemos el archivo de la carpeta temporal a la carpeta objetivo y verificamos si fue exitoso
if (move_uploaded_file($url_temp, $url_target)) {
echo "El archivo " . htmlspecialchars(basename($file)) . " ha sido cargado con éxito.";
} else {
echo "Ha habido un error al cargar tu archivo.";
}
?>
¡Hasta aquí lo básico! ya puedes subir cualquier tipo de archivos, pero seguramente querrás poner algunas restricciones, como limite de tamaño o tipo de archivo. Así que veamos el caso:
Validando límite de tamaño de archivo
Creamos una variable $validator para controlar si el archivo se subirá o no.
$validator = 1;
Ahora obtenemos el peso de nuestro archivo mediante su propiedad size y validamos, si el peso del archivo supera 1MB (1000000 Bytes) entonces asignamos cero (0) a $validator.
$file_size = $_FILES["fileTest"]["size"];
if ( $file_size > 1000000) {
echo "El archivo es muy pesado";
$validator = 0;
}
Validando tipo de archivo
Ahora validaremos el tipo de archivo, usaremos la misma variable $validator del caso anterior para controlar si el archivo se cargará o no.
Obtenemos la extensión de nuestro archivo a través del método pathinfo(..ARCHIVO.. , PATHINFO_EXTENSION) y usamos strtolower para convertir a minúsculas y facilitar la validación.
$file_type = strtolower(pathinfo($file,PATHINFO_EXTENSION));
Ahora validamos por ejemplo, que nuestro archivo sea una imagen con formato JPG, PNG o GIF
if($file_type != "jpg" && $file_type != "jpeg" && $file_type != "png" && $file_type != "gif" ) {
echo "Solo se permiten imágenes tipo JPG, JPEG, PNG & GIF";
$validator = 0;
}
Ahora bien, nuestro código con validaciones quedaría de la siguiente forma:
<?php
$file = $_FILES["fileTest"]["name"]; //Nombre de nuestro archivo
$validator = 1; //Variable validadora
$file_type = strtolower(pathinfo($file,PATHINFO_EXTENSION)); //Extensión de nuestro archivo
$url_temp = $_FILES["fileTest"]["tmp_name"]; //Ruta temporal a donde se carga el archivo
//dirname(__FILE__) nos otorga la ruta absoluta hasta el archivo en ejecución
$url_insert = dirname(__FILE__) . "/files"; //Carpeta donde subiremos nuestros archivos
//Ruta donde se guardara el archivo, usamos str_replace para reemplazar los "\" por "/"
$url_target = str_replace('\\', '/', $url_insert) . '/' . $file;
//Si la carpeta no existe, la creamos
if (!file_exists($url_insert)) {
mkdir($url_insert, 0777, true);
};
//Validamos el tamaño del archivo
$file_size = $_FILES["fileTest"]["size"];
if ( $file_size > 1000000) {
echo "El archivo es muy pesado";
$validator = 0;
}
//Validamos la extensión del archivo
if($file_type != "jpg" && $file_type != "jpeg" && $file_type != "png" && $file_type != "gif" ) {
echo "Solo se permiten imágenes tipo JPG, JPEG, PNG & GIF";
$validator = 0;
}
//movemos el archivo de la carpeta temporal a la carpeta objetivo y verificamos si fue exitoso
if($validator == 1){
if (move_uploaded_file($url_temp, $url_target)) {
echo "El archivo " . htmlspecialchars(basename($file)) . " ha sido cargado con éxito.";
} else {
echo "Ha habido un error al cargar tu archivo.";
}
}else{
echo "Error: el archivo no se ha cargado";
}
?>
Espero que este artículo sobre como guardar imágenes o archivos en el servidor con PHP haya sido de tu utilidad. No dudes en compartirlo con alguien que lo necesite y recuerda que puedes conseguir mas artículos como este en:
Si necesitas mas información sobre el tema:
Muy interesante el apunto, me sirvio mucho. Estaban resolviendo este problema de la imagenes y con su aporte saque adelante mi proyecto. Muchas gracias.
Hola Hernando, me alegra mucho que te haya sido útil. Un abrazo!
Hola Muchas Gracias por tu dedicación y compartir con los novatos.
El código funciona, pero yo necesito cambiar la carpeta donde se almacena lo enviado. tampoco se o bien no ubico, donde esta la carpeta /files:
Muchas gracias.
Hola Enrique, ten en cuenta que la carpeta /files la creas tu. En el caso de este ejemplo, creamos la carpeta files al mismo nivel del archivo php donde esta este código (no se si me he explicado bien)