ChatGPT解决这个技术问题 Extra ChatGPT

How to load image (and other assets) in Angular an project?

I'm pretty new to Angular so I'm not sure the best practice to do this.

I used angular-cli and ng new some-project to generate a new app.

In it created an "images" folder in the "assets" folder, so now my images folder is src/assets/images

In app.component.html (which is the root of my application), I put

<img class="img-responsive" src="assets/images/myimage.png">

When I do ng serve to view my web application, the image does not display.

What is the best practice to load up images in an Angular application?

EDIT: See answer below. My actual image name was using spaces, which Angular did not like. When I removed the spaces in the file name, the image displayed correctly.

yes you are right , you gave correct path syntax from assets fodler, might be problem with your name mismatch, check if image is present or not
Definitely not a name mismatch, I ended up creating a public folder outside of src and displaying the image with <img class="img-responsive" src="../../public/images/myimage.png">
Fixed it. My actual image file name had spaces in it, and for whatever reason Angular did not like that. When I removed the spaces from my file name, assets/images/myimage.png worked.
good :) btw no need to create extra public folder in Updated cli they already have same named asstes.
I have a similar problem with files with other extensions (e.g. .sgf) I want to host those files and link to them from the application, but apparently simply putting them in the assets folder isn't enough. Any ideas ?

m
mruanova

In my project I am using the following syntax in my app.component.html:

<img src="/assets/img/1.jpg" alt="image">

or

<img src='http://mruanova.com/img/1.jpg' alt='image'>

use [src] as a template expression when you are binding a property using interpolation:

<img [src]="imagePath" />

is the same as:

<img src={{imagePath}} />

Source: how to bind img src in angular 2 in ngFor?


is your app.component.html and assets folder in the same level?
No, the folder structure is created automatically and you should have the same folders than me: project-folder\src\assests\ and project-folder\app\app.component.html if this helps please upvote.
u
user3183717

I fixed it. My actual image file name had spaces in it, and for whatever reason Angular did not like that. When I removed the spaces from my file name, assets/images/myimage.png worked.


I had a special character '^' in the filename and had the same problem,after renaming it worked, so i believe that angular doesn't like special characters and spaces in the filenames
j
jmuhire

Angular-cli includes the assets folder in the build options by default. I got this issue when the name of my images had spaces or dashes. For example :

'my-image-name.png' should be 'myImageName.png'

'my image name.png' should be 'myImageName.png'

If you put the image in the assets/img folder, then this line of code should work in your templates :

<img alt="My image name" src="./assets/img/myImageName.png">

If the issue persist just check if your Angular-cli config file and be sure that your assets folder is added in the build options.


[alt] is not necessary for strings, [] is for data binding.
B
Bhuwan Maharjan

Being specific to Angular2 to 5, we can bind image path using property binding as below. Image path is enclosed by the single quotation marks.

Sample example

<img [src]="'assets/img/klogo.png'" alt="image">


what's the difference between src="assets/img/klogo.png" and [src]="'assets/img/klogo.png'"?
@gdbj here is the answer stackoverflow.com/questions/41426974/…
so basically, we use [src] to bind to the model if we want to be able to change the src using that method.
Thanks mohit for answering the thread. @gdbj I hope you had your confusions sorted by now.
Would just like to point out for future readers to look for the inner single quotes in the first comment here by gdbj. They're harder to see in the comment font than they are in the answer above, but missing them could lead to some confusion. (May depend on your browser, not sure.)
c
chrispy

Normally "app" is the root of your application -- have you tried app/path/to/assets/img.png?


angular-cli put app and assets folders separately under the src folder. (sorry I'm not sure how I'm supposed to format folder structure and names)
B
Bheem Singh

1 . Add this line on top in component.

declare var require: any

2 . add this line in your component class.

imgname= require("../images/imgname.png");

add this 'imgname' in img src tag on html page.


this is better for file hierarchy tree's that aren't flat.
It also solves issue of caching by generating hash for the image. This works perfectly in Angular 8 But in angular 9 we need to access default property. imgname= require("../images/imgname.png").default; this is the hacky way. Do you know any another solution for importing images ? which should not be change after version upgrade.
A
Anonymous Creator

for me "I" was capital in "Images". which also angular-cli didn't like. so it is also case sensitive.

Some web servers like IIS don't have problem with that, if angular application is hosted in IIS, case sensitive is not a problem.


A
Anand Raja

You can follow the below steps in Angular 8+

Step 1: load the image as below in component

const logo = require('../assets/logo.svg').default as string;

@Component({
    selector: 'app-show-image',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class ShowImageComponent implements OnInit {

  logo = logo;
  constructor() { }
  ngOnInit() { }

}

step 2: Add the logic in html file

<img [src]="logo" [alt]="'logo'">

If launched without further configuration, you will see a strange error:

ERROR in src/app/app.component.ts(4,14): error TS2580: Cannot find name 'require'. Do you need to install type definitions for node? Try `npm i @types/node` and then add `node` to the types field in your tsconfig.

Do as suggested – add the @types/node typings to your project by running npm install @types/node and edit tsconfig.app.json to set:

"compilerOptions": {
    "types": ["node"],
    ...
}

For more info resource


using import didn't work for me: import logoSvg from '../../assets/shared/logo.svg'; it cannot find the type and it's declaration
Got this Error when doing import the image like it said above: src/app/header/header.component.ts:2:14 - error TS2591: Cannot find name 'require'. Do you need to install type definitions for node? Try npm i --save-dev @types/node and then add 'node' to the types field in your tsconfig. 2 const logo = require('../assets/logo.svg').default as string;
You've to install @types/node and edit tsconfig.app.json as below "compilerOptions": { "types": ["node"], ... }
s
sznczy

It is always dependent on where is your html file that refers to the path of the static resource (in this case the image).

Example A:

src
|__assests
   |__images
      |__myimage.png
|__yourmodule
   |__yourpage.html

As you can see, yourpage.html is one folder away from the root (src folder), for this reason it needs one amount of ../ to go back to the root then you can walk to the image from root:

<img class="img-responsive" src="../assests/images/myimage.png">

Example B:

src
|__assests
   |__images
      |__myimage.png
|__yourmodule
   |__yoursubmodule
      |__yourpage.html

Here you have to go u in the tree by 2 folders:

<img class="img-responsive" src="../../assests/images/myimage.png">

By default, Angular puts the src folder at the base level with the app and assets folders directly inside where app is supposed to be reserved for the actual application (all html, ts, css files). I'm curious as to why you would be putting modules outside of the src folder much less outside of the application. I feel like this goes against all conventions for file structures.
R
Raxsi

Try not give space while loading the images.

Instead of

<img src='assets/img/myimage.png' alt="">     

try with string interpolation or Property Binding to load the source image as best practice.