The purpose of this package is to create a wrapper for Angular for fileupload using flow.js.
https://stackblitz.com/edit/ngx-flow-example
You can also find example source code in the projects/ngx-flow-demo folder.
- âś… 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
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 dependencies :
npm install @flowjs/flow.js @flowjs/ngx-flowImport 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 AppModuleWe use dependecy injection to provide flow.js library.
-
Start up server. There is a server example taken from flow.js here in
serverdirectory. In this repo you can run it usingnpm run server. -
First you need to initialize ngx-flow directive and export it as for example
flowvariable:<ng-container #flow="flow" [flowConfig]="{target: 'http://localhost:3000/upload'}"></ng-container>
-
Now you can use either directive
flowButtonfor select file dialog:<input type="file" flowButton [flow]="flow.flowJs" [flowAttributes]="{accept: 'image/*'}" />
Or
flowDropfor drag&drop feature:<div class="drop-area" flowDrop [flow]="flow.flowJs"></div>
For both you have to pass
[flow]=flow.flowJswhereflowis template variable exported in step 1. -
You can than subscribe to observable of transfers:
<div *ngFor="let transfer of (flow.transfers$ | async).transfers"></div>
-
After adding files you can begin upload using
upload()method:<button type="button" (click)="flow.upload()" [disabled]="!(flow.somethingToUpload$ | async)">Start upload</button>
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*/ } }You can find it under flow variable.
<p>Is flowjs supported by the browser? {{flow.flowJs?.support}}</p>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; } }Add singleFile: true to your flow config:
<ng-container #flow="flow" [flowConfig]="{target: 'http://localhost:3000/upload', singleFile: true}"></ng-container>Add flowDirectoryOnly="true" to your button:
<input type="file" flowButton [flow]="flow.flowJs" flowDirectoryOnly="true" [flowAttributes]="{accept: 'image/*'}" />Use directive flowSrc:
<div *ngFor="let transfer of (flow.transfers$ | async).transfers"> <img [flowSrc]="transfer" /> </div>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(); } }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