Introducción
Hoy veremos cómo subir una foto o imagen a un servidor PHP. Dicha foto será elegida por el usuario desde un input de tipo file. La subiremos utilizando la clase FormData de Javascript en conjunto con la clase para recibir archivos en CodeIgniter.
Esto lo haremos utilizando AJAX, por lo que la experiencia del usuario será mejor. Este post funciona para imágenes GIF, PNG o JPG pero supongo que igualmente podemos subir archivos de cualquier tipo.
Lado del cliente
En el lado del cliente tengo mi input de tipo file, con un id para tener una referencia a él desde jQuery. También tengo un botón que servirá para enviar el archivo. No hay formulario porque como tal no enviaremos un formulario, enviaremos un archivo por AJAX:
<input accept="image/*" id="fotoAlumno" type="file">
<button id="guardarImagen">Subir</button>
En Javascript tengo la referencia al input y al botón. Escucharemos el click del botón y accederemos al arreglo de archivos de nuestro input. Con ello crearemos un objeto de tipo FormData y luego lo mandaremos por AJAX a nuestro controlador de CodeIgniter:
$(function() {
var $fotoAlumno = $("#fotoAlumno"),
$btnGuardar = $("#guardarImagen");
$btnGuardar.click(function() {
var archivos = $fotoAlumno[0].files;
if (archivos.length > 0) {
var foto = archivos[0]; //Sólo queremos la primera imagen, ya que el usuario pudo seleccionar más
var lector = new FileReader();
//Ojo: En este caso 'foto' será el nombre con el que recibiremos el archivo en el servidor
formData.append('foto', foto);
$.ajax({
url: "htpp://localhost/la/ruta/de/nuestro/controlador",
data: formData,
type: 'POST',
contentType: false,
processData: false,
success: function(resultados) {
console.log("Petición terminada. Resultados", resultados);
}
});
}
});
});
Con eso ya hemos terminado la parte del cliente. Vamos con el servidor.
Lado del servidor
En nuestro controlador de CodeIgniter debemos cargar el ayudante para subir archivos. Recibir la imagen será pan comido. En mi caso, mi método se llama ponerFotoAlumno y se ve así:
<?php
defined("BASEPATH") or exit("No direct script access allowed");
class Alumnos extends CI_Controller
{
public function ponerFotoAlumno()
{
$config['upload_path'] = './fotos_alumnos/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 2048;
$this->load->library('upload', $config);
if (!$this->upload->do_upload('foto')) { #Aquí me refiero a "foto", el nombre que pusimos en FormData
$error = array('error' => $this->upload->display_errors());
echo json_encode($error);
} else {
echo json_encode(true);
}
}
}
Lo que hacemos es simplemente recibir el archivo y guardarlo en la carpeta fotos_alumnos. Las opciones que puse son simplemente para aceptar imágenes que no excedan el peso de 2 MB.
Conclusión
Con esto pude subir una foto con FormData utilizando AJAX y jQuery. Hay opciones para cambiar el nombre de la imagen, recibir el nombre con el que se guardó, etcétera. La documentación oficial la dejo abajo.
Por cierto, en mi caso utilizo JSON para devolver la respuesta de la petición y trabajar con ella en el cliente, pero esto es opcional y podemos manejarlo como deseemos.
Referencias
Aquí dejo las especificaciones de cada cosa utilizada.
y la variable lector para q sirvió si nunca se usa?
Hola. Cierto, seguramente lo había tomado de otro código y olvidé borrarla.