Listado completo de tutoriales
ES6 - API fetch (enviar un archivo adjunto) |
Otra actividad común en una aplicación web es la de enviar archivos a un servidor para que sean almacenados.
Cuando necesitamos adjuntar uno o más archivos y enviarlos al servidor el API fetch requiere también que se haga por el método POST.
La siguiente página permite seleccionar un archivo y mediante 'fetch' enviar el archivo adjunto:
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <p>Foto:<input type="file" id="foto" required></p> <p><button type="button" id="boton1">Subir foto</button></p> <p><img id="imagen"></p> <script> document.getElementById("boton1").addEventListener("click", () => agregar()); function agregar() { let fd = new FormData(); fd.append("foto", document.getElementById("foto").files[0]); fetch('subirfoto.php', { method: 'POST', body: fd }) .then(response => response.json()) .then(datos => { if (datos.resultado == "Ok") document.getElementById("imagen").setAttribute("src", document.getElementById("foto").files[0].name); }) } </script> </body> </html>
Disponemos la etiqueta 'input' con el valor 'file' en la propiedad 'type':
<p>Foto:<input type="file" id="foto" required></p> <p><button type="button" id="boton1" >Subir foto</button></p> <p><img id="imagen"></p>
Cuando se presiona el botón subir se llama a la función 'agregar' donde creamos un objeto de tipo 'FormData':
let fd = new FormData();
Llamamos al método 'append' del FormData y asociamos un nombre en este caso "foto" y los datos del control HTML que tienen la referencia del archivo adjunto:
fd.append("foto", document.getElementById("foto").files[0]);
Llamamos al método 'fetch' y configuramos el método de envío 'POST' y en la propiedad 'body' pasamos el objeto FormData previamente creado:
fetch('subirfoto.php', { method: 'POST', body: fd }) .then(response => response.json())
Una vez subido el archivo si se nos retorna "Ok" procedemos a mostrar la imagen, recuperando la misma del servidor donde la subimos:
.then(datos => { if (datos.resultado == "Ok") document.getElementById("imagen").setAttribute("src", document.getElementById("foto").files[0].name); })
La aplicación PHP que almacena la foto en el servidor es:
<?php move_uploaded_file($_FILES['foto']['tmp_name'], $_FILES['foto']['name']); echo '{"resultado":"Ok"}'; ?>