<!DOCTYPE html>
<html data-ng-app="LoaderApp">
<head>
<link data-require="bootstrap-css@*" data-semver="3.0.0" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
<link data-require="bootstrap@*" data-semver="3.0.0" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
<script data-require="jquery@*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script data-require="bootstrap@*" data-semver="3.0.0" src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script data-require="angular.js@*" data-semver="1.2.0-rc2" src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div data-ng-controller="testCtrl">
Select your file...
<data-np-filereader data-ng-model="model.blob"></data-np-filereader>
You've selected {{model.blob.filename}}{{model.blob.filesize}}
<div>Here is some base64 data from it: {{model.blob.filedata}}</div>
</div>
</body>
</html>
// Code goes here
function npFilereader($timeout) {
return {
restrict: 'E',
require: '?ngModel',
replace: true,
template: '<div>' +
'<button style="width:30px" data-ng-click="selectFile()">+</button>' +
'<button style="width:30px" data-ng-click="clearFile()">-</button> ' +
'<a style="cursor:pointer; text-decoration:underline; width:120px; max-width:120px" ' +
' data-ng-click="download()">{{model.filename}}{{model.filesize}}</a>' +
'<input style="position:absolute; opacity:0; top:0px; right:0px" ' +
' type="file" data-ng-model="model.filedata" />' +
'</div>',
scope: { blob:'=ngModel' },
link: function(scope, element, attrs, ngModel) {
if(!ngModel) return;
console.log("link()");
var model = scope.blob;
scope.model = model; // for use from within the template
$timeout(function() { scope.$apply(); }, 0);
scope.selectFile = function() {
console.log("selectFile()");
element.find('input').click();
}
scope.clearFile = function() {
console.log("clearFile()");
scope.blob.filename = undefined;
scope.blob.filedata = undefined;
scope.blob.filesize = "";
}
scope.download = function() {
console.log("download("+scope.filename+")");
}
ngModel.$render = function() {
console.log("render()");
};
$(element).find('input').bind('change', function(e) {
var element = e.target;
var options = {promise: undefined};
if (element.files.length > 0) {
var filename = element.files[0].name.slice(0);
console.log("added...");
var reader = new FileReader();
reader.onload = function(e){
// The input was solid!
var values = e.target.result;
// So, clear any error popovers
if (options.promise !== undefined) {
$timeout.cancel(options.promise);
element.popover('destroy');
}
// ...and update the model.
model.filename = filename;
//model.filedata = '';
model.filedata = values;
var lengthInBytes = values.length;
model.filesize = " (" + lengthInBytes + " bytes)";
ngModel.$setViewValue(model);
$timeout(function() { scope.$apply(); }, 0);
}
reader.onerror = function(e) {
showError(
' Σφάλμα κατά την ανάγνωση του αρχείου "'+filename+'"',
element, options, $timeout);
}
reader.readAsDataURL(element.files[0]);
} else {
console.log("Removed...");
model.filename = undefined;
model.filedata = undefined;
model.filesize = "";
ngModel.$setViewValue(model);
$timeout(function() { scope.$apply(); }, 0);
}
});
}
};
}
function testCtrl($scope) {
var blobData = {
filename:'oldFilename.txt',
filesize:undefined,
filedata:undefined
}
$scope.model = {blob: blobData};
}
var application = angular.module('LoaderApp', []);
application.directive('npFilereader', npFilereader);
/* Styles go here */