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 src 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
npm install @flowjs/flow.js @flowjs/ngx-flow
Import in your module:
import{NgxFlowModule,FlowInjectionToken}from'@flowjs/ngx-flow';importFlowfrom'@flowjs/flow.js';
@NgModule({imports: [NgxFlowModule],providers: [{provide: FlowInjectionToken,useValue: Flow}]})exportclassAppModuleWe 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:<inputtype="file" flowButton[flow]="flow.flowJs" [flowAttributes]="{accept: 'image/*'}">
Or
flowDropfor drag&drop feature:<divclass="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">
After adding files you can begin upload using
upload()method:<buttontype="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">exportclassAppComponent{trackTransfer(transfer: Transfer){returntransfer.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:
<inputtype="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.
exportclassAppComponentimplementsAfterViewInit,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 - builds the library into dist folder
After that you can publish to npm repository from dist folder:
cd dist/ngx-flow
npm publish