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.
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.
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.
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.
Aquí dejo las especificaciones de cada cosa utilizada.
Clase para trabajar con archivos subidos en CodeIgniter
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
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.