A simple directive to create a customizable file input control.
A Pen by Donggeon Lee on CodePen.
A simple directive to create a customizable file input control.
A Pen by Donggeon Lee on CodePen.
<div ng-app="app"> | |
<div ng-controller="UploadController as vm"> | |
<div class="container"> | |
<div class="page-header"> | |
<h1>Angular file upload directive</h1> | |
<h6>A simple directive to create a customizable file input control.</h6> | |
</div> | |
<div class="alert alert-info"> | |
Don't forget to display the console in CodePen to see the uploaded file ! | |
</div> | |
<form ng-model="vm.file" my-file-upload> | |
<div class="form-group"> | |
<label for="fileName">Select a file</label> | |
<div class="input-group"> | |
<input type="text" id="fileName" class="form-control" readonly ng-model="fileName" ng-click="browse()"> | |
<span class="input-group-btn"> | |
<button type="button" class="btn btn-default" ng-click="browse()">Browse</button> | |
</span> | |
</div> | |
</div> | |
<div> | |
<button type="reset" class="btn btn-default" ng-click="reset()">Reset</button> | |
<button type="button" class="btn btn-primary" ng-click="vm.upload()" ng-disabled="!vm.file">Upload</button> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div> |
var app = angular.module("app", ["myDirectives"]); | |
var myDirectives = angular.module("myDirectives", []); | |
app.controller("UploadController", function ($log) { | |
this.upload = function () { | |
$log.info("Uploading:", this.file || "no file selected!"); | |
} | |
}) | |
myDirectives.directive("myFileUpload", function ($compile) { | |
return { | |
restrict: "AE", | |
require: "ngModel", | |
scope: true, | |
link: link | |
}; | |
function link (scope, element, attrs, ngModel) { | |
var input = angular.element("<input type=\"file\" style=\"display: none;\">"); | |
input.bind("browse", function () { | |
this.click(); | |
}); | |
input.bind("change", function (changed) { | |
if (changed.target.files.length < 1) { | |
return; | |
} | |
var fileName = changed.target.files[0].name; | |
var reader = new FileReader(); | |
reader.onload = function (loaded) { | |
scope.fileName = fileName; | |
ngModel.$setViewValue(loaded.target.result); | |
}; | |
reader.readAsDataURL(changed.target.files[0]); | |
}); | |
$compile(input)(scope); | |
element.append(input); | |
scope.browse = function () { | |
input.triggerHandler("browse"); | |
}; | |
scope.reset = function () { | |
scope.fileName = null; | |
ngModel.$setViewValue(null); | |
}; | |
} | |
}); |
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular.min.js"></script> |
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" /> |