Skip to content

flowjs/ngx-flow

Repository files navigation

NgxFlow

Build Status Test Coverage Maintainability code style: prettier

The purpose of this package is to create a wrapper for Angular for fileupload using flow.js.

Demo

https://stackblitz.com/edit/ngx-flow-example

You can also find example source code in the projects/ngx-flow-demo folder.

Roadmap

  • âś… upload single file
  • âś… upload multiple files
  • âś… queue management
  • âś… error handling
  • âś… pause / resume upload
  • âś… cancel upload, cancel all uploads
  • âś… upload progress
  • âś… file / directory restrictions
  • âś… drag & drop
  • âś… display uploaded image
  • âś… tests
  • âś… upload right after selecting file
  • âś… run tests using TravisCI
  • âś… demo using Stackblitz
  • âś… support for server side rendering

Compatibility

From the v18, we aligned the main version of this library with Angular (and Angular CLI).

For previous versions, use the matrix below:

Angular @flowjs/ngx-flow
17 0.8.1
16 0.7.2
15 (not available)
14 0.6.0
13 0.5.0
12 (not available)
6 -> 11 0.4.6

Install

Install dependencies :

npm install @flowjs/flow.js @flowjs/ngx-flow

Import in your module:

import { NgxFlowModule, FlowInjectionToken } from '@flowjs/ngx-flow';
import Flow from '@flowjs/flow.js';

@NgModule({
  imports: [NgxFlowModule],
  providers: [
    {
      provide: FlowInjectionToken,
      useValue: Flow
    }
  ]
})
export class AppModule

We use dependecy injection to provide flow.js library.

How to use

  1. Start up server. There is a server example taken from flow.js here in server directory. In this repo you can run it using npm run server.

  2. First you need to initialize ngx-flow directive and export it as for example flow variable:

    <ng-container #flow="flow" [flowConfig]="{target: 'http://localhost:3000/upload'}"></ng-container>
  3. Now you can use either directive flowButton for select file dialog:

    <input type="file" flowButton [flow]="flow.flowJs" [flowAttributes]="{accept: 'image/*'}" />

    Or flowDrop for drag&drop feature:

    <div class="drop-area" flowDrop [flow]="flow.flowJs"></div>

    For both you have to pass [flow]=flow.flowJs where flow is template variable exported in step 1.

  4. You can than subscribe to observable of transfers:

    <div *ngFor="let transfer of (flow.transfers$ | async).transfers"></div>
  5. After adding files you can begin upload using upload() method:

    <button type="button" (click)="flow.upload()" [disabled]="!(flow.somethingToUpload$ | async)">Start upload</button>

How does transfers$ data look like?

Observable flow.transfers$ emits state in form:

{
  totalProgress: 0.5,
  transfers: [
    {
      name: "somefile.txt",
      flowFile: FlowFile,
      progress: number,
      error: boolean,
      paused: boolean,
      success: boolean,
      complete: boolean,
      currentSpeed: number,
      averageSpeed: number,
      size: number,
      timeRemaining: number,
    },
    {
      name: "uploading.txt",
      flowFile: FlowFile,
      progress: 0.5,
      error: false,
      paused: false,
      success: false,
      complete: false,
      currentSpeed: number,
      averageSpeed: number,
      size: number,
      timeRemaining: number,
    },
    {
      name: "failed-to-upload.txt",
      flowFile: FlowFile,
      progress: number,
      error: true,
      paused: false,
      success: false,
      complete: true,
      currentSpeed: number,
      averageSpeed: number,
      size: number,
      timeRemaining: number,
    }
    {
      name: "uploaded.txt",
      flowFile: FlowFile,
      progress: number,
      error: false,
      paused: false,
      success: true,
      complete: true,
      currentSpeed: number,
      averageSpeed: number,
      size: number,
      timeRemaining: number,
    }
  ],
  flow: { /* flow.js instance*/ }
}

FAQ

I need access to flow.js object

You can find it under flow variable.

<p>Is flowjs supported by the browser? {{flow.flowJs?.support}}</p>

I see flickering when upload is in progress

Use trackBy for ngFor:

<div *ngFor="let transfer of (flow.transfers$ | async).transfers; trackBy: trackTransfer"></div>
export class AppComponent {
  trackTransfer(transfer: Transfer) {
    return transfer.id;
  }
}

I need just a single file

Add singleFile: true to your flow config:

<ng-container #flow="flow" [flowConfig]="{target: 'http://localhost:3000/upload', singleFile: true}"></ng-container>

I want to upload whole directory

Add flowDirectoryOnly="true" to your button:

<input type="file" flowButton [flow]="flow.flowJs" flowDirectoryOnly="true" [flowAttributes]="{accept: 'image/*'}" />

I want to display image which is going to be uploaded

Use directive flowSrc:

<div *ngFor="let transfer of (flow.transfers$ | async).transfers">
  <img [flowSrc]="transfer" />
</div>

How to trigger upload right after picking the file?

Subscribe to events$. NgxFlow listens for these events: filesSubmitted, fileRemoved, fileRetry, fileProgress, fileSuccess, fileError of flow.js. Event fileSubmitted is fired when user drops or selects a file.

export class AppComponent implements AfterViewInit, OnDestroy {
  @ViewChild('flow')
  flow: FlowDirective;

  autoUploadSubscription: Subscription;

  ngAfterViewInit() {
    this.autoUploadSubscription = this.flow.events$.subscribe((event) => {
      if (event.type === 'filesSubmitted') {
        this.flow.upload();
      }
    });
  }

  ngOnDestroy() {
    this.autoUploadSubscription.unsubscribe();
  }
}

Development

npm run build:lib - builds the library into dist folder

After that you can publish to npm repository from dist folder:

cd dist/ngx-flow
npm publish

About

flow.js file upload for angular

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 14

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy