¿Cómo servir imágenes en Angular2?

80

Estoy tratando de poner la ruta relativa a una de mis imágenes en mi carpeta de activos en una etiqueta src de imagen en mi aplicación Angular2. Establecí una variable en mi componente en 'fullImagePath' y la usé en mi plantilla. He probado muchos caminos posibles diferentes, pero parece que no puedo mejorar mi imagen. ¿Hay alguna ruta especial en Angular2 que siempre sea relativa a una carpeta estática como en Django?

Componente

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-hero',
  templateUrl: './hero.component.html',
  styleUrls: ['./hero.component.css']
})

export class HeroComponent implements OnInit {
  fullImagePath: string;

  constructor() {
    this.fullImagePath = '../../assets/images/therealdealportfoliohero.jpg'
  }

  ngOnInit() {
  }

}

También puse la imagen en la misma carpeta que este componente, por lo que, dado que la plantilla y css en la misma carpeta funcionan, no estoy seguro de por qué una ruta relativa similar a la imagen no funciona. Este es el mismo componente con la imagen en la misma carpeta.

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-hero',
  templateUrl: './hero.component.html',
  styleUrls: ['./hero.component.css']
})

export class HeroComponent implements OnInit {
  fullImagePath: string;

  constructor() {
    this.fullImagePath = './therealdealportfoliohero.jpg'
  }

  ngOnInit() {
  }

}

html

<div class="row">
    <div class="col-xs-12">
        <img [src]="fullImagePath">
    </div>
</div>

árbol de aplicaciones * Dejé fuera la carpeta de módulos de nodo para ahorrar espacio

├── README.md
├── angular-cli.json
├── e2e
│   ├── app.e2e-spec.ts
│   ├── app.po.ts
│   └── tsconfig.json
├── karma.conf.js
├── package.json
├── protractor.conf.js
├── src
│   ├── app
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── hero
│   │   │   ├── hero.component.css
│   │   │   ├── hero.component.html
│   │   │   ├── hero.component.spec.ts
│   │   │   ├── hero.component.ts
│   │   │   └── portheropng.png
│   │   ├── index.ts
│   │   └── shared
│   │       └── index.ts
│   ├── assets
│   │   └── images
│   │       └── therealdealportfoliohero.jpg
│   ├── environments
│   │   ├── environment.dev.ts
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   ├── test.ts
│   ├── tsconfig.json
│   └── typings.d.ts
└── tslint.json
TJB
fuente
4
¿Por qué quieres usar la ruta relativa? ¿No podemos configurarlo para que comience desde la raíz (es decir this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg')?
Harry Ninh
1
Desafortunadamente eso no funcionó. ¿Cómo sabe la aplicación dónde está la raíz? ¿Es la raíz del proyecto o siempre son activos para archivos estáticos como css, imágenes y javascript?
TJB
Sí, realmente depende de tu configuración. Para mí, separo los activos de la parte del código (al tener diferentes tareas de tragar para ellos) para saber exactamente dónde están los activos.
Harry Ninh
Phwew, finalmente lo hizo funcionar Harry. Tenías razón al usar la ruta completa. La razón por la que no funcionaba fue un problema que tuve en el pasado al usar Photoshop y no exportar imágenes desde allí correctamente. Argghhh Photoshoppppp! De todos modos ¡Gracias Harry!
TJB

Respuestas:

110

Angular solo apunta a la src/assetscarpeta, nada más es público para acceder a través de la URL, por lo que debe usar la ruta completa

 this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg'

O

 this.fullImagePath = 'assets/images/therealdealportfoliohero.jpg'

Esto solo funcionará si la etiqueta href base está configurada con /

También puede agregar otras carpetas para los datos angular/cli. Todo lo que necesitas modificar esangular-cli.json

"assets": [
 "assets",
 "img",
 "favicon.ico",
 ".htaccess"
]

Nota en la edición: el comando Dist intentará encontrar todos los archivos adjuntos de los activos, por lo que también es importante mantener las imágenes y los archivos a los que desee acceder a través de la URL dentro de los activos, como los archivos de datos json simulados también deben estar en los activos.

Umar Younis
fuente
1
Gracias por tu respuesta, me ayudó mucho. Le agradecería que me dijera en qué parte de los documentos oficiales está documentado esto.
Ziv Glazer
Proyectos angulares realizados con pista angular-cli desde donde se pueden servir los activos en el .angular-cli.jsonarchivo. Consulte la respuesta de @ michal-ambrož para obtener más información.
kevin.groat
1
¡Gracias! ... cuando has estado jugando con Angular durante meses y de repente te das cuenta de que aún no has tenido que agregar una sola imagen ;-)
Simon_Weaver
"Esto solo funcionará si la etiqueta href base está configurada con /" ¿Qué debo hacer si mi href base debe configurarse en otra ruta porque mi aplicación se ejecutará en un subdirectorio del servidor?
Gilles
Encontrará la carpeta de activos en ese directorio, por lo que creo que no habrá ningún problema
Umar Younis
11

Si no le gusta la carpeta de activos, puede editar .angular-cli.jsony agregar otras carpetas que necesite.

  "assets": [
    "assets",
    "img",
    "favicon.ico"
  ]
Michal Ambrož
fuente
3
¿Por qué si lo agrego "assets": [ "assets", "assets/images", "favicon.ico" ],todavía no funciona?
bielas
4

Agregue su ruta de imagen como fullPathname='assets/images/therealdealportfoliohero.jpg'en su constructor. Definitivamente funcionará.

Gajanan Kulkarni
fuente
3

Estoy usando el proyecto de plantilla angular Asp.Net Core con un frontal y un paquete web de Angular 4. Tuve que usar '/ dist / assets / images /' delante del nombre de la imagen y almacenar la imagen en el directorio assets / images en el directorio dist. p.ej:

 <img  class="img-responsive" src="/dist/assets/images/UnitBadge.jpg">
davaus
fuente
Pero cuando estás en desarrollo, esto no funcionaría, ¿verdad?
devN
2
@davaus probablemente porque ya hiciste una compilación, por lo que tu antiguo 'dist' está ahí. Si actualiza una imagen, no se actualizará hasta que la compile.
Simon_Weaver
Eso tiene sentido. Gracias.
davaus
1

Simplemente coloque sus imágenes en la carpeta de activos y refiéralas en sus htmlpáginas o tsarchivos con ese enlace.

Abhishek G
fuente
1

En angular, solo se solicita una página al servidor, que es index.html. Y index.html y la carpeta de activos están en el mismo directorio. al poner una imagen en cualquier componente, le da un valor src como assets\image.png. Esto funcionará bien porque el navegador hará una solicitud al servidor para esa imagen y el paquete web podrá servir esa imagen.

R.Sarkar
fuente