Angular

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.

Introducció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 variables photoFile y photoPreview.
  • 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.

Certifícate en Angular con CertiDevs PLUS

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

Angular
Puzzle

Guards funcionales

Angular
Test

Decodificar JWT en Angular

Angular
Test

Servicio con HttpClient

Angular
Código

Ciclo de vida de componentes en Angular

Angular
Test

Gestión de productos de Fake Store API

Angular
Proyecto

Data binding en Angular

Angular
Test

Routes sin módulos en Angular

Angular
Código

Router en Angular

Angular
Test

Instalación de Angular

Angular
Puzzle

Route Guards basados en interfaces

Angular
Código

La directiva @if en Angular

Angular
Puzzle

Formularios reactivos en Angular

Angular
Código

Servicios en Angular

Angular
Puzzle

Interceptor funcional

Angular
Test

Servicio con Array

Angular
Código

La directiva @for en Angular

Angular
Puzzle

Interceptores HTTP

Angular
Código

Componentes standalone true

Angular
Puzzle

Formularios con ngModel en Angular

Angular
Puzzle

Routes en Angular

Angular
Test

Comunicación entre componentes Angular

Angular
Test

Parámetros en rutas con ActivatedRoute

Angular
Test

CRUD de Restaurantes y Platos

Angular
Proyecto

Tablas en Angular Material

Angular
Puzzle

Formulario de registro de usuarios

Angular
Proyecto

Instalación y uso de NgBoostrap

Angular
Puzzle

Desarrollo de componentes Angular

Angular
Test

JWT en Angular

Angular
Código

Formularios reactivos en Angular

Angular
Puzzle

Formularios en Angular Material

Angular
Puzzle

Layout con Angular Material

Angular
Puzzle

Effects en Angular

Angular
Test

Data binding

Angular
Código

HttpClient en servicios de Angular

Angular
Puzzle

Desarrollo de módulos Angular

Angular
Puzzle

Comandos Angular CLI

Angular
Puzzle

Subir archivo en formularios

Angular
Test

La directiva routerLink en Angular

Angular
Test

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

Angular

Introducción Y Entorno

Comandos Angular Cli

Angular

Introducción Y Entorno

Desarrollo De Componentes Angular

Angular

Componentes

Data Binding En Angular

Angular

Componentes

Ciclo De Vida De Componentes En Angular

Angular

Componentes

Comunicación Entre Componentes Angular

Angular

Componentes

La Directiva @If En Angular

Angular

Componentes

La Directiva @For En Angular

Angular

Componentes

Componentes Standalone

Angular

Componentes

Desarrollo De Módulos Angular

Angular

Módulos

Routes En Angular

Angular

Enrutado Y Navegación

Router En Angular

Angular

Enrutado Y Navegación

La Directiva Routerlink En Angular

Angular

Enrutado Y Navegación

Parámetros En Rutas Con Activatedroute

Angular

Enrutado Y Navegación

Routes Sin Módulos En Angular

Angular

Enrutado Y Navegación

Servicios En Angular

Angular

Servicios E Inyección De Dependencias

Httpclient En Servicios De Angular

Angular

Servicios E Inyección De Dependencias

Formularios Con Ngmodel En Angular

Angular

Formularios

Formularios Reactivos En Angular

Angular

Formularios

Subir Archivo En Formularios

Angular

Formularios

Layout Con Angular Material

Angular

Integración Con Angular Material

Tablas En Angular Material

Angular

Integración Con Angular Material

Formularios En Angular Material

Angular

Integración Con Angular Material

Instalación Y Uso De Ngboostrap

Angular

Integración Con Bootstrap Css

Signals En Angular

Angular

Signals Y Reactividad

Effects En Angular

Angular

Signals Y Reactividad

Route Guards Basados En Interfaces

Angular

Autenticación Y Autorización

Guards Funcionales

Angular

Autenticación Y Autorización

Interceptores Http Basados En Interfaz

Angular

Autenticación Y Autorización

Interceptores Http Funcionales

Angular

Autenticación Y Autorización

Seguridad Jwt En Angular

Angular

Autenticación Y Autorización

Decodificar Tokens Jwt En Angular

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