Easy to use Angular directives for user file selections
npm install angular-fileEasy to use Angular directives for user file selections (DEMO PAGE)








> This package is to handle select/drag/drop of files. Once files are selected, for uploading, you then use Angular's @angular/common/http for uploading selected files (see here for more on uploading).
Table of Contents
- Quick Start
- Examples
- Practical Example
- Select Files Examples
- Drop Files Examples
- API
- ngf Directive
- ngfDrop Directive
- ngfBackground Directive
- ngfSrc Directive
- ngfSelect Directive
- ngfUploadStatus Directive
- Uploading
- Troubleshooting
- Development
- Credits
- License
1. A recommended way to install angular-file is through npm package manager using the following command:
npm install angular-file --save-dev
Alternatively, you can download it in a ZIP file.
2. Currently angular-file contains three directives: ngf, ngfSelect, and ngfDrop. ngf and ngfSelect are quite the same with just different defaults and they both utilize functionality. ngfDrop is used to designate an area that will be used for dropping of file(s).
3. More information regarding using of angular-file is located in demo and demo sources.
to the body of index.html``typescript
import { ngfModule, ngf } from "angular-file"
import { Component, NgModule } from "@angular/core"
import {
HttpClient, HttpClientModule, HttpRequest, HttpResponse, HttpEvent
} from "@angular/common/http"
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"
import { BrowserModule } from '@angular/platform-browser'
import { Subscription } from 'rxjs'
// two ways to upload files
const template =
ngf
multiple
type = "file"
accept = "image/*"
[(files)] = "files"
maxSize = "1024"
capturePaste = "1"
/>
[(FormData)] = "myFormData"
postName = "file"
>
[httpEvent] = "httpEvent"
>
@Component({
selector: 'app',
template: template
})
export class AppComponent {
postUrl = '...'
myFormData:FormData//populated by ngfFormData directive
httpEvent:HttpEvent<{}>
constructor(public HttpClient:HttpClient){}
uploadFiles(files:File[]) : Subscription {
const config = new HttpRequest('POST', this.postUrl, this.myFormData, {
reportProgress: true
})
return this.HttpClient.request( config )
.subscribe(event=>{
this.httpEvent = event
if (event instanceof HttpResponse) {
alert('upload complete, old school alert used')
}
},
error=>{
alert('!failure beyond compare cause:' + error.toString())
})
}
}
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
ngfModule
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule {}
platformBrowserDynamic().bootstrapModule(AppModule);
`
$3
Examples of how to allow file selectionMultiple
`html
`Single
`html
`Element
`html
Tap to Select
`Image Backgrounds Only
`html
style="background-size:cover;background-repeat:no-repeat;width:50px;height:50px"
>Images Only
`html
![]()
`$3
Examples of how to allow file drag/dropBasic
`html
[(files)]="files"
[(file)]="file"
([validDrag])="validDrag"
([invalidDrag])="invalidDrag"
[ngClass]="{'myHoverClass': validDrag, 'myAntiHoverClass': validDrag}"
>
Drop Files Here
Combo Drop Select
`html
[(files)]="files"
[(validDrag)]="validComboDrag"
[(invalidDrag)]="invalidComboDrag"
[ngClass]="{'goodDragClass':validComboDrag, 'badDragClass':invalidComboDrag}"
>
Combo drop/select zone
API
- ngf Directive
- ngfDrop Directive
- ngfSelect Directive
- ngfBackground Directive
- ngfSrc Directive
- ngfUploadStatus Directive
$3
A base directive that provides abilities of ngfDrop and ngfSelect. Does not auto default nor auto host element events like hover/drag/drop (see ngfDrop and/or ngfSelect)
`typescript
ngf : ngf // reference to directive class
[multiple] : string
[accept] : string
[maxSize] : number // bytes . 1024 = 1k . 1048576 = 1mb
[ngfFixOrientation] : boolean = true
[fileDropDisabled] : any = false
[selectable] : any = false
[(lastInvalids)] : {file:File,type:string}[] = []
[(lastBaseUrl)] : string // Base64 od last file uploaded url
[(file)] : File // last file uploaded
[(files)] : File[]
(init) : EventEmitter
[capturePaste] : boolean // listen to window paste event for files
(fileSelectStart) : EventEmitter // Event fired for user selecting files starting
`$3
Extends ngf and then auto hosts element event watching of hover/drag/drop
`javascript
[fileDropDisabled] : any = false
(fileOver) :EventEmitter = new EventEmitter()
[(validDrag)] :any = false
[(invalidDrag)] :any = false
`> Supporting Internet Explorer 11 or less?
>> Only (fileOver) works accurately
>> [(validDrag)] & [(invalidDrag)] should NOT be used as IE11 does not indicate the number of files NOR the types of files being dragged like other modern web browsers
$3
Extends ngf and auto engages click base file selecting
`javascript
[selectable]:any = true
`$3
`javascript
[ngfBackground]:File
`$3
`javascript
[ngfSrc]:File
`$3
Does calculations of an upload event and provideds percent of upload completed
`typescript
[(percent)]:number
[httpEvent]:Event
`$3
Converts files to FormData
`typescript
[files]:File[]
[postName]:string = "file"
[fileName]:string//optional force file name
[(FormData)]:FormData
`Uploading
Angular, natively, makes uploading files so very easy!
Did you know?
- You do NOT and should NOT use a seperate package to upload files other than
@angular/common
- You do not need a package like ng2-file-upload which have outdated non-core-community driven file uploading scripts
- Just can just use @angular/common to send files! Why add more unneccessary weight of dependency of another package?
- Multi file uploading is so easy with @angular/common
- You will have the most control seperating your file selecting from file uploading
- You should use this package, angular-file, to select files and then give to Angular to uploadUploading files is as easy as:
`
import { Subscription } from "rxjs"//only included for data typing
import {
HttpClient, HttpRequest, HttpResponse
} from "@angular/common/http"export const uploadFiles(files:File[]) : Subscription {
const postUrl = "..."
const myFormData:FormData = new FormData()
files.forEach(file=>myFormData.append("file", file, "file-name.xyz"))
const config = new HttpRequest("POST", postUrl, myFormData), {
reportProgress: true
})
return this.HttpClient.request( config )
.subscribe(event=>{
if (event instanceof HttpResponse) {
alert('upload complete, old school alert used')
}
},
error=>{
alert('!failure cause:' + error.toString())
})
}
`
Troubleshooting
Please follow this guidelines when reporting bugs and feature requests:1. Use GitHub Issues board to report bugs and feature requests (not our email address)
2. Please always write steps to reproduce the error. That way we can focus on fixing the bug, not scratching our heads trying to reproduce it.
Thanks for understanding!
Development
Work on this package> Source files are on not the default github branch
`
git clone https://github.com/AckerApple/angular-file.git -b development
``