Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including ngx-file-drop with all npm packages installed. Try it out:

require("@angular/common/package.json"); // @angular/common is a peer dependency. require("@angular/core/package.json"); // @angular/core is a peer dependency. require("tslib/package.json"); // tslib is a peer dependency. var ngxFileDrop = require("ngx-file-drop")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

ngx-file-drop v9.0.1

Angular ngx-file-drop - Simple desktop file and folder drag and drop

npm npm downloads Travis MIT licensed


An Angular 9 module for simple desktop file and folder drag and drop. This library does not need rxjs-compat.

For previous Angular support please use older versions.

This library relies on HTML 5 File API thus IE and Safari are not supported


You can check the DEMO of the library


npm install ngx-file-drop --save


Importing The 'ngx-file-drop' Module

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { NgxFileDropModule } from 'ngx-file-drop';

  declarations: [
  imports: [
  providers: [],
  bootstrap: [AppComponent]
export class AppModule { }

Enabling File Drag

import { Component } from '@angular/core';
import { NgxFileDropEntry, FileSystemFileEntry, FileSystemDirectoryEntry } from 'ngx-file-drop';

  selector: 'demo-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
export class AppComponent {

  public files: NgxFileDropEntry[] = [];

  public dropped(files: NgxFileDropEntry[]) {
    this.files = files;
    for (const droppedFile of files) {

      // Is it a file?
      if (droppedFile.fileEntry.isFile) {
        const fileEntry = droppedFile.fileEntry as FileSystemFileEntry;
        fileEntry.file((file: File) => {

          // Here you can access the real file
          console.log(droppedFile.relativePath, file);

          // You could upload it like this:
          const formData = new FormData()
          formData.append('logo', file, relativePath)

          // Headers
          const headers = new HttpHeaders({
            'security-token': 'mytoken'

'', formData, { headers: headers, responseType: 'blob' })
          .subscribe(data => {
            // Sanitized logo returned from backend

      } else {
        // It was a directory (empty directories are added, otherwise only files)
        const fileEntry = droppedFile.fileEntry as FileSystemDirectoryEntry;
        console.log(droppedFile.relativePath, fileEntry);

  public fileOver(event){

  public fileLeave(event){

<div class="center">
    <ngx-file-drop dropZoneLabel="Drop files here" (onFileDrop)="dropped($event)" 
    (onFileOver)="fileOver($event)" (onFileLeave)="fileLeave($event)">
        <ng-template ngx-file-drop-content-tmp let-openFileSelector="openFileSelector">
          Optional custom content that replaces the the entire default content.
          <button type="button" (click)="openFileSelector()">Browse Files</button>
    <div class="upload-table">
        <table class="table">
            <tbody class="upload-name-style">
                <tr *ngFor="let item of files; let i=index">
                    <td><strong>{{ item.relativePath }}</strong></td>


(onFileDrop)On drop function called after the files are read(onFileDrop)="dropped($event)"
(onFileOver)On drop over function(onFileOver)="fileOver($event)"
(onFileLeave)On drop leave function(onFileLeave)="fileLeave($event)"
acceptString of accepted formatsaccept=".png"
directoryWhether directories are accepteddirectory="true"
dropZoneLabelText to be displayed inside the drop boxdropZoneLabel="Drop files here"
dropZoneClassNameCustom style class name(s) to be used on the "drop-zone" areadropZoneClassName="my-style"
contentClassNameCustom style class name(s) to be used for the content areacontentClassName="my-style"
[disabled]Conditionally disable the dropzone[disabled]="condition"
[showBrowseBtn]Whether browse file button should be shown[showBrowseBtn]="true"
browseBtnClassNameCustom style class name(s) to be used for the buttonbrowseBtnClassName="my-style"
browseBtnLabelThe label of the browse file buttonbrowseBtnLabel="Browse files"
multipleWhether multiple or single files are acceptedmultiple="true"
useDragEnterUse dragenter event instead of dragoveruseDragEnter="true"



Change Log


Donate Crypto

  • Ethereum: 0x22d557543ba1f8ac1dadc4eec5ea1b9ae03e0da8
  • Ripple: rJeJTHNyDkqurBBAAUzo4xhJyQo9mhTCJH


RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free