<!DOCTYPE html>
<html>
<head>
<title>Input File Component for Angular 2</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://file.myfontastic.com/SLzQsLcd7FmmzjBYTcyVW3/icons.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<!-- IE required polyfills, in this exact order -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.33.3/es6-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.16/system-polyfills.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.6/angular2-polyfills.min.js"></script>
<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.6/Rx.min.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.6/angular2.min.js"></script>
<script>
System.config({
transpiler: 'typescript',
packages: {'app': { defaultExtension: 'ts' }}
});
System.import('app/main')
.then(null, console.error.bind(console));
</script>
</head>
<body>
<my-app>Loading Component...</my-app>
</body>
</html>
html, body {
height: 100%;
margin: 0;
padding: 0;
}
body {
align-items: center;
display: flex;
flex-direction: column;
font-family: sans-serif;
justify-content: center;
text-align: center;
}
button {
margin-top: 2em;
}
Custom input file created as a component for **Angular 2**
/* File Uploader Styles */
.uploader input {
display: none;
}
.uploader {
-webkit-align-items: center;
align-items: center;
background-color: #efefef;
background-color: rgba(0, 0, 0, 0.02);
cursor: pointer;
display: -webkit-flex;
display: flex;
height: 300px;
-webkit-justify-content: center;
justify-content: center;
outline: 3px dashed #ccc;
outline-offset: 5px;
position: relative;
width: 300px;
}
.uploader img,
.uploader .icon {
pointer-events: none;
}
.uploader,
.uploader .icon {
-webkit-transition: all 100ms ease-in;
-moz-transition: all 100ms ease-in;
-ms-transition: all 100ms ease-in;
-o-transition: all 100ms ease-in;
transition: all 100ms ease-in;
}
.uploader .icon {
color: #eee;
color: rgba(0, 0, 0, 0.2);
font-size: 5em;
}
.uploader img {
left: 50%;
opacity: 0;
max-height: 100%;
max-width: 100%;
position: absolute;
top: 50%;
-webkit-transition: all 300ms ease-in;
-moz-transition: all 300ms ease-in;
-ms-transition: all 300ms ease-in;
-o-transition: all 300ms ease-in;
transition: all 300ms ease-in;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
z-index: -1;
}
.uploader img.loaded {
opacity: 1;
}
import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
bootstrap(AppComponent);
import {Component} from 'angular2/core';
@Component({
selector: 'file-uploader',
templateUrl: 'app/file-uploader.component.html',
styleUrls: ['app/file-uploader.component.css'],
inputs:['activeColor','baseColor','overlayColor']
})
export class FileUploaderComponent {
activeColor: string = 'green';
baseColor: string = '#ccc';
overlayColor: string = 'rgba(255,255,255,0.5)';
dragging: boolean = false;
loaded: boolean = false;
imageLoaded: boolean = false;
imageSrc: string = '';
handleDragEnter() {
this.dragging = true;
}
handleDragLeave() {
this.dragging = false;
}
handleDrop(e) {
e.preventDefault();
this.dragging = false;
this.handleInputChange(e);
}
handleImageLoad() {
this.imageLoaded = true;
this.iconColor = this.overlayColor;
}
handleInputChange(e) {
var file = e.dataTransfer ? e.dataTransfer.files[0] : e.target.files[0];
var pattern = /image-*/;
var reader = new FileReader();
if (!file.type.match(pattern)) {
alert('invalid format');
return;
}
this.loaded = false;
reader.onload = this._handleReaderLoaded.bind(this);
reader.readAsDataURL(file);
}
_handleReaderLoaded(e) {
var reader = e.target;
this.imageSrc = reader.result;
this.loaded = true;
}
_setActive() {
this.borderColor = this.activeColor;
if (this.imageSrc.length === 0) {
this.iconColor = this.activeColor;
}
}
_setInactive() {
this.borderColor = this.baseColor;
if (this.imageSrc.length === 0) {
this.iconColor = this.baseColor;
}
}
}
<label class="uploader" ondragover="return false;"
[class.loaded]="loaded"
[style.outlineColor]="dragging ? activeColor : baseColor"
(dragenter)="handleDragEnter()"
(dragleave)="handleDragLeave()"
(drop)="handleDrop($event)">
<i class="icon icon-upload"
[style.color]="dragging
? ((imageSrc.length > 0) ? overlayColor : activeColor)
: ((imageSrc.length > 0) ? overlayColor : baseColor)"></i>
<img
[src]="imageSrc"
(load)="handleImageLoad()"
[class.loaded]="imageLoaded"/>
<input type="file" name="file" accept="image/*"
(change)="handleInputChange($event)">
</label>
import {Component} from 'angular2/core';
import {FileUploaderComponent} from './file-uploader.component';
@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html',
directives: [FileUploaderComponent]
})
export class AppComponent {}
<form>
<file-uploader [activeColor]="'orangered'" [baseColor]="'lightgray'"></file-uploader>
</form>