GitHub - flowjs/ngx-flow: flow.js file upload for angular (original) (raw)
NgxFlow
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 src
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
Angular | @flowjs/ngx-flow |
---|---|
19 | ^19.0.0 |
18 | ^18.0.0 |
17 | 0.8.1 |
16 | 0.7.2 |
15 | - |
14 | 0.6.0 |
13 | 0.5.0 |
12 | - |
6 -> 11 | 0.4.6 |
Install
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
- Start up server. There is a server example taken from flow.js here in
server
directory. In this repo you can run it usingnpm run server
. - First you need to initialize ngx-flow directive and export it as for example
flow
variable:
<ng-container #flow="flow" [flowConfig]="{target: '" title="undefined" rel="noopener noreferrer">http://localhost:3000/upload'}"> - Now you can use either directive
flowButton
for select file dialog:
<input type="file" flowButton [flow]="flow.flowJs" [flowAttributes]="{accept: 'image/*'}" />
OrflowDrop
for drag&drop feature: For both you have to pass `[flow]=flow.flowJs` where `flow` is template variable exported in step 1. - You can than subscribe to observable of transfers:
- After adding files you can begin upload using
upload()
method:
<button type="button" (click)="flow.upload()" [disabled]="!(flow.somethingToUpload$ | async)">Start upload
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.
Is flowjs supported by the browser? {{flow.flowJs?.support}}
I see flickering when upload is in progress
Use trackBy
for ngFor
:
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}">
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
:
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