Làm thế nào để phục vụ hình ảnh trong Angular2?


80

Tôi đang cố gắng đặt đường dẫn tương đối đến một trong các hình ảnh của mình trong thư mục nội dung trong thẻ src hình ảnh trong ứng dụng Angular2 của tôi. Tôi đặt một biến trong thành phần của mình thành 'fullImagePath' và sử dụng biến đó trong mẫu của tôi. Tôi đã thử nhiều con đường khả thi khác nhau, nhưng dường như không thể làm nổi hình ảnh của tôi. Có một số đường dẫn đặc biệt trong Angular2 luôn liên quan đến một thư mục tĩnh như trong Django không?

Thành phần

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() {
  }

}

Tôi cũng đặt ảnh vào cùng một thư mục với thành phần này, vì vậy vì mẫu và css trong cùng một thư mục đang hoạt động nên tôi không chắc tại sao một đường dẫn tương tự đến hình ảnh lại không hoạt động. Đây là thành phần giống với hình ảnh trong cùng một thư mục.

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>

cây ứng dụng * Tôi đã bỏ thư mục mô-đun nút để tiết kiệm dung lượng

├── 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

4
Tại sao bạn muốn sử dụng đường dẫn tương đối? Chúng ta không thể thiết lập nó để bắt đầu từ gốc (ví dụ this.fullImagePath = '/assets/images/therealdealportfoliohero.jpg')
Harry Ninh

1
Thật không may, điều đó đã không hoạt động. Làm thế nào để ứng dụng biết gốc ở đâu? Nó là gốc của dự án hay nó luôn là tài sản cho các tệp tĩnh như css, hình ảnh và javascript?
TJB

Yea nó thực sự phụ thuộc vào thiết lập của bạn. Đối với tôi, tôi tách nội dung ra khỏi phần mã (bằng cách thực hiện các nhiệm vụ gulp khác nhau cho chúng) để tôi biết chính xác vị trí của nội dung.
Harry Ninh

Phwew, cuối cùng cũng làm được rồi Harry. Bạn đã đúng khi sử dụng đường dẫn đầy đủ. Lý do nó không hoạt động là một vấn đề mà tôi đã gặp phải trước đây khi sử dụng photoshop và không xuất hình ảnh từ đó một cách chính xác. Argghhh Photoshoppppp! Dù sao cũng cảm ơn Harry!
TJB

Câu trả lời:


110

Angular chỉ trỏ đến src/assetsthư mục, không có gì khác là công khai để truy cập qua url, vì vậy bạn nên sử dụng đường dẫn đầy đủ

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

Hoặc là

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

Điều này sẽ chỉ hoạt động nếu thẻ href cơ sở được đặt bằng /

Bạn cũng có thể thêm các thư mục khác cho dữ liệu trong angular/cli. Tất cả những gì bạn cần sửa đổi làangular-cli.json

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

Lưu ý trong chỉnh sửa: Lệnh Dist sẽ cố gắng tìm tất cả các tệp đính kèm từ nội dung, vì vậy điều quan trọng là phải giữ hình ảnh và bất kỳ tệp nào bạn muốn truy cập qua url bên trong nội dung, chẳng hạn như tệp dữ liệu json giả cũng phải nằm trong nội dung.


1
Cảm ơn câu trả lời của bạn, nó đã giúp tôi rất nhiều. Tôi sẽ đánh giá cao nếu bạn có thể cho tôi biết điều này được ghi ở đâu trong các tài liệu chính thức?
Ziv Glazer

Các dự án Angular được thực hiện với theo dõi angle-cli nơi nội dung có thể được phân phối từ trong .angular-cli.jsontệp. Xem câu trả lời @ michal-ambrož để biết thêm thông tin.
kevin.groat

1
Cám ơn! ... khi bạn đã chơi xung quanh với góc trong nhiều tháng và đột nhiên bạn nhận ra rằng mình chưa có thêm một hình ảnh duy nhất ;-)
Simon_Weaver

"Điều này sẽ chỉ hoạt động nếu thẻ cơ sở href được đặt bằng /" Tôi cần làm gì nếu href cơ sở của tôi cần được thiết lập cho một đường dẫn khác vì ứng dụng của tôi sẽ chạy trong một thư mục con trên máy chủ?
Gilles

Nó sẽ tìm ra tài sản thư mục trong thư mục đó nên sẽ không có vấn đề tôi nghĩ
Umar Younis

11

Nếu bạn không thích thư mục tài sản, bạn có thể chỉnh sửa .angular-cli.jsonvà thêm các thư mục khác mà bạn cần.

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

3
Tại sao nếu tôi thêm "assets": [ "assets", "assets/images", "favicon.ico" ],nó vẫn không hoạt động?
bielas

4

Thêm đường dẫn hình ảnh của bạn như fullPathname='assets/images/therealdealportfoliohero.jpg'trong hàm tạo của bạn. Nó sẽ hoạt động chắc chắn.


3

Tôi đang sử dụng dự án mẫu góc cạnh Asp.Net Core với giao diện người dùng Angular 4 và webpack. Tôi phải sử dụng '/ dist / asset / images /' trước tên hình ảnh và lưu trữ hình ảnh trong thư mục tài sản / hình ảnh trong thư mục dist. ví dụ:

 <img  class="img-responsive" src="/dist/assets/images/UnitBadge.jpg">

Nhưng khi bạn đang trong quá trình phát triển, điều này sẽ không hoạt động đúng không?
devN

2
@davaus có lẽ vì bạn đã xây dựng xong nên 'dist' cũ của bạn chỉ nằm ở đó. Nếu bạn cập nhật hình ảnh, nó sẽ không được làm mới cho đến khi bạn tạo.
Simon_Weaver

Điều đó có lý. Cảm ơn.
davaus

1

Chỉ cần đặt hình ảnh của bạn trong thư mục nội dung, giới thiệu chúng trong các htmltrang hoặc tstệp của bạn với liên kết đó.


1

Trong góc chỉ có một trang được yêu cầu từ máy chủ, đó là index.html. Và index.html và thư mục tài sản nằm trên cùng một thư mục. trong khi đưa hình ảnh vào bất kỳ thành phần nào sẽ cung cấp giá trị src như thế nào assets\image.png. Điều này sẽ hoạt động tốt vì trình duyệt sẽ yêu cầu máy chủ cho hình ảnh đó và gói web sẽ có thể phân phát hình ảnh đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.