This example does pretty much what I would like to port in Angular-js: HTML5 File API.
I have been trying to google some example of directives however I found old example that do massive use of DOM or are not written for Angular 1.0.4.
Basically this is the pure js code:
var holder = document.getElementById('holder'), state = document.getElementById('status'); if (typeof window.FileReader === 'undefined') { state.className = 'fail'; } else { state.className = 'success'; state.innerHTML = 'File API & FileReader available'; } holder.ondragover = function () { this.className = 'hover'; return false; }; holder.ondragend = function () { this.className = ''; return false; }; holder.ondrop = function (e) { this.className = ''; e.preventDefault(); var file = e.dataTransfer.files[0], reader = new FileReader(); reader.onload = function (event) { console.log(event.target); holder.style.background = 'url(' + event.target.result + ') no-repeat center'; }; console.log(file); reader.readAsDataURL(file); return false; };
The only possible way I can think of is creating a directive that does
edo.directive('fileDrag', function () { return { restrict: 'A', link: function (scope, elem) { elem.bind('ondrop', function(e){ e.preventDefault(); var file = e.dataTransfer.files[0], reader = new FileReader(); reader.onload = function (event) { console.log(event.target); holder.style.background = 'url(' + event.target.result + ') no-repeat center'; }; console.log(file); reader.readAsDataURL(file); return false; }); } }; });
However (1) it did not work, (2) before I fix it I would like to know if something exists or if I am doing it properly,
Any hint or help is very much appreciated.
To consolidate the comments into an answer, change ondrop
to drop
, add e.stopPropagation()
, change holder
to elem
.
edo.directive('fileDrag', function () { return { restrict: 'A', link: function (scope, elem) { elem.bind('drop', function(e){ e.preventDefault(); e..stopPropagation(); var file = e.dataTransfer.files[0], reader = new FileReader(); reader.onload = function (event) { console.log(event.target); elem.style.background = 'url(' + event.target.result + ') no-repeat center'; }; console.log(file); reader.readAsDataURL(file); return false; }); } }; });
I was doing something similar and here is my working solution:
HTML
app.directive("dropzone", function() { return { restrict : "A", link: function (scope, elem) { elem.bind('drop', function(evt) { evt.stopPropagation(); evt.preventDefault(); var files = evt.dataTransfer.files; for (var i = 0, f; f = files[i]; i++) { var reader = new FileReader(); reader.readAsArrayBuffer(f); reader.onload = (function(theFile) { return function(e) { var newFile = { name : theFile.name, type : theFile.type, size : theFile.size, lastModifiedDate : theFile.lastModifiedDate } scope.addfile(newFile); }; })(f); } }); } } });
div[dropzone] { border: 2px dashed #bbb; border-radius: 5px; padding: 25px; text-align: center; font: 20pt bold; color: #bbb; margin-bottom: 20px; }
<div dropzone>Drop Files Here</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With