Angular
Tutorial Angular: Subir archivo en formularios
Angular: Aprende a subir archivos en formularios, crear componentes y previsualizar imágenes antes de enviarlas al backend con esta guía paso a paso.
Aprende Angular GRATIS y certifícateIntroducción
En esta lección crearemos un componente avatar desde el que poder subir una imagen de perfil al backend desde angular.
Crear componente avatar
Ejecutar el comando:
ng generate component avatar-form --standalone
Variables y métodos para manejo del archivo
Se crean las variables:
photoFile
que tendrá el archivo cargado por el usuario.photoPreview
que tendrá la imagen para previsualizarla por pantalla antes de subirla.
Resultado del archivo avatar-form.component.ts
:
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
export interface User {
id?: number;
username?: string;
email?: string;
photoUrl?: string;
}
@Component({
selector: 'app-avatar-form',
standalone: true,
imports: [],
templateUrl: './avatar-form.component.html',
styleUrl: './avatar-form.component.css'
})
export class AvatarFormComponent implements OnInit {
photoFile: File | undefined;
photoPreview: string | undefined;
user: User | undefined;
constructor(private httpClient: HttpClient) {}
ngOnInit(): void {
this.httpClient.get<User>('http://localhost:3000/user/account')
.subscribe(user => this.user = user);
}
onFileChange(event: Event) {
}
save() {
}
}
Métodos:
ngOnInit()
carga el usuario autenticado para poder traer su avatar existente.onFileChange()
detectará la carga del archivo y lo guardará en las variablesphotoFile
yphotoPreview
.save()
envía el archivo al backend.
Crear formulario HTML
En el archivo avatar-form.component.html
se crea un formulario con bootstrap con un solo campo que permita cargar un archivo:
<div class="container">
<div class="row">
<div class="col-lg-8">
<h1 class="my-5">Avatar de usuario</h1>
<form>
<div class="input-group mb-3">
<label class="input-group-text" for="photoUrl">Subir foto</label>
<input type="file" class="form-control" id="photoUrl" (change)="onFileChange($event)">
</div>
<button class="w-100 btn btn-primary btn-lg" type="button" (click)="save()">Subir avatar</button>
</form>
</div>
<div class="col-lg-4">
@if(photoPreview) {
<h3 class="my-5">Nuevo avatar a subir</h3>
<img class="img-fluid" [src]="photoPreview">
}
@if (!photoPreview && user?.photoUrl) {
<h3 class="my-5">Avatar existente</h3>
<img class="img-fluid" [src]="'http://localhost:3000/uploads/' + user?.photoUrl">
}
</div>
</div>
</div>
En este HTML hay un solo input que permite cargar un archivo y automáticamente se invoca el método onFileChange()
donde se gestionará el archivo.
Método onFileChange()
Este método guarda el archivo en una variable para poder subirlo más tarde en el método save()
cuando el usuario pulse “Subir avatar”.
También se encarga de leer el archivo para poder mostrarlo por pantalla.
onFileChange(event: Event) {
let target = event.target as HTMLInputElement;
if (target.files !== null && target.files.length > 0) {
this.photoFile = target.files[0]; // extraer el primer archivo
// Opcional: Mostrar la imagen por pantalla para previsualizarla antes de subirla
let reader = new FileReader();
reader.onload = event => this.photoPreview = reader.result as string;
reader.readAsDataURL(this.photoFile);
}
}
Este método solo lee un archivo. Si se quisiera leer más de uno entonces debe manejarse el array entero target.files
.
Método save()
Este método es invocado cuando el usuario pulsa el botón de “Subir avatar”.
Carga el archivo en un objeto FormData
y lo envía al backend.
save() {
if (!this.photoFile) return;
let formData = new FormData();
formData.append('file', this.photoFile);
// si se quiere es posible agregar más información al formData provenientes de un formulario reactivo
// Por ejemplo otros datos del usuario:
// formData.append('address', this.userForm.get('address')?.value)
this.httpClient.post<User>('http://localhost:3000/user/avatar', formData)
.subscribe(user => {
this.photoFile = undefined;
this.photoPreview = undefined;
this.user = user;
});
}
Se envía el archivo al método http://localhost:3000/user/avatar
del backend.
Ejercicios de esta lección Subir archivo en formularios
Evalúa tus conocimientos de esta lección Subir archivo en formularios con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Signals en Angular
Guards funcionales
Decodificar JWT en Angular
Servicio con HttpClient
Ciclo de vida de componentes en Angular
Gestión de productos de Fake Store API
Data binding en Angular
Routes sin módulos en Angular
Router en Angular
Instalación de Angular
Route Guards basados en interfaces
La directiva @if en Angular
Formularios reactivos en Angular
Servicios en Angular
Interceptor funcional
Servicio con Array
La directiva @for en Angular
Interceptores HTTP
Componentes standalone true
Formularios con ngModel en Angular
Routes en Angular
Comunicación entre componentes Angular
Parámetros en rutas con ActivatedRoute
CRUD de Restaurantes y Platos
Tablas en Angular Material
Formulario de registro de usuarios
Instalación y uso de NgBoostrap
Desarrollo de componentes Angular
JWT en Angular
Formularios reactivos en Angular
Formularios en Angular Material
Layout con Angular Material
Effects en Angular
Data binding
HttpClient en servicios de Angular
Desarrollo de módulos Angular
Comandos Angular CLI
Subir archivo en formularios
La directiva routerLink en Angular
Todas las lecciones de Angular
Accede a todas las lecciones de Angular y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Instalación Angular
Introducción Y Entorno
Comandos Angular Cli
Introducción Y Entorno
Desarrollo De Componentes Angular
Componentes
Data Binding En Angular
Componentes
Ciclo De Vida De Componentes En Angular
Componentes
Comunicación Entre Componentes Angular
Componentes
La Directiva @If En Angular
Componentes
La Directiva @For En Angular
Componentes
Componentes Standalone
Componentes
Desarrollo De Módulos Angular
Módulos
Routes En Angular
Enrutado Y Navegación
Router En Angular
Enrutado Y Navegación
La Directiva Routerlink En Angular
Enrutado Y Navegación
Parámetros En Rutas Con Activatedroute
Enrutado Y Navegación
Routes Sin Módulos En Angular
Enrutado Y Navegación
Servicios En Angular
Servicios E Inyección De Dependencias
Httpclient En Servicios De Angular
Servicios E Inyección De Dependencias
Formularios Con Ngmodel En Angular
Formularios
Formularios Reactivos En Angular
Formularios
Subir Archivo En Formularios
Formularios
Layout Con Angular Material
Integración Con Angular Material
Tablas En Angular Material
Integración Con Angular Material
Formularios En Angular Material
Integración Con Angular Material
Instalación Y Uso De Ngboostrap
Integración Con Bootstrap Css
Signals En Angular
Signals Y Reactividad
Effects En Angular
Signals Y Reactividad
Route Guards Basados En Interfaces
Autenticación Y Autorización
Guards Funcionales
Autenticación Y Autorización
Interceptores Http Basados En Interfaz
Autenticación Y Autorización
Interceptores Http Funcionales
Autenticación Y Autorización
Seguridad Jwt En Angular
Autenticación Y Autorización
Decodificar Tokens Jwt En Angular
Autenticación Y Autorización
Certificados de superación de Angular
Supera todos los ejercicios de programación del curso de Angular y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Crear un input de tipo file en HTML para cargar una imagen
- Leer la imagen y mostrarla por pantalla
- Enviar la imagen a backend con FormData