Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get the reference of a file through the HTML's input tag? (Angular 2)

I want to upload an image in Firebase. But to do that I have to get the file first. How can I get an image of my computer, for instance, through the HTML? I'm trying to do this, but I don't know what's the return of this. Help me guys...

<input type="file" name="image" [(ngModel)]="myImage">
like image 268
flpn Avatar asked Apr 07 '17 19:04

flpn


People also ask

How do you get input from a file in HTML?

<input type="file"> <input> elements with type="file" let the user choose one or more files from their device storage. Once chosen, the files can be uploaded to a server using form submission, or manipulated using JavaScript code and the File API.

How to take input in Angular?

You can use Angular event bindings to respond to any DOM event. Many DOM events are triggered by user input. Binding to these events provides a way to get input from the user. To bind to a DOM event, surround the DOM event name in parentheses and assign a quoted template statement to it.

How do you reset the selected file with an input tag type in angular 9?

import { ViewChild } from "@angular/core"; ViewChild allows you to set a reference variable to your input, using that you can clear the value of input. After clearing the value of input using the reference variable, the selected file will be reset.


2 Answers

You can reference the DOM Element using ElementRef and then extract the data of the file uploaded from the element reference. Use #variableName to reference the file input.

<input #fileInput (change)="fileUpload()" type="file" name="pic" accept="image/*">

In your component class, reference the file input using ViewChild.

import {Component, ElementRef, Renderer2, ViewChild} from '@angular/core'
@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>{{name}}</h2>
      <input #fileInput (change)="fileUpload()" type="file" name="pic" accept="image/*">
    </div>
  `,
})
export class App {
  name:string; 
  @ViewChild('fileInput') el:ElementRef;
  constructor(private rd: Renderer2) {
    this.name = `Angular : File Upload`
  }

  fileUpload() {
    console.log(this.el);
    // Access the uploaded file through the ElementRef
    this.uploadedFile = this.el.nativeElement.files[0]; 

  }
}

I have created a sample plunker here.

like image 178
Midhun Darvin Avatar answered Oct 25 '22 19:10

Midhun Darvin


Why don't you use directive with change event?

component.html

<input type='file' uploader accept=".txt,.doc">

uploader.directive.ts

import { Directive, HostListener } from '@angular/core';

@Directive({
  selector: '[uploader]'
})
export class UploaderDirective {

  @HostListener('change',['$event.target.files'])
  onChanges(files) {
    this.readFile(files[0])
  }

  readFile(file){
    let fileReader = new FileReader();
    fileReader.onload = async (e: any) => {
      //DO SOMETHING HERE with e.target.result            
    }
    fileReader.readAsText(file);         
  }

}

Don't forget to add the Directive to your module.

like image 3
John Avatar answered Oct 25 '22 21:10

John