123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /**!
- * AngularJS file upload/drop directive with http post and progress
- * @author Danial <danial.farid@gmail.com>
- * @version 1.1.10
- */
- (function() {
-
- var angularFileUpload = angular.module('angularFileUpload', []);
- angularFileUpload.service('$upload', ['$http', '$rootScope', '$timeout', function($http, $rootScope, $timeout) {
- this.upload = function(config) {
- config.method = config.method || 'POST';
- config.headers = config.headers || {};
- config.headers['Content-Type'] = undefined;
- config.transformRequest = config.transformRequest || $http.defaults.transformRequest;
- var formData = new FormData();
- if (config.data) {
- for (var key in config.data) {
- var val = config.data[key];
- if (!config.formDataAppender) {
- if (typeof config.transformRequest == 'function') {
- val = config.transformRequest(val);
- } else {
- for (var i = 0; i < config.transformRequest.length; i++) {
- var fn = config.transformRequest[i];
- if (typeof fn == 'function') {
- val = fn(val);
- }
- }
- }
- formData.append(key, val);
- } else {
- config.formDataAppender(formData, key, val);
- }
- }
- }
- config.transformRequest = angular.identity;
- formData.append(config.fileFormDataName || 'file', config.file, config.file.name);
- formData['__setXHR_'] = function(xhr) {
- config.__XHR = xhr;
- xhr.upload.addEventListener('progress', function(e) {
- if (config.progress) {
- $timeout(function() {
- config.progress(e);
- });
- }
- }, false);
- //fix for firefox not firing upload progress end
- xhr.upload.addEventListener('load', function(e) {
- if (e.lengthComputable) {
- $timeout(function() {
- config.progress(e);
- });
- }
- }, false);
- };
- config.data = formData;
-
- var promise = $http(config);
-
- promise.progress = function(fn) {
- config.progress = fn;
- return promise;
- };
-
- promise.abort = function() {
- if (config.__XHR) {
- $timeout(function() {
- config.__XHR.abort();
- });
- }
- return promise;
- };
- promise.then = (function(promise, origThen) {
- return function(s, e, p) {
- config.progress = p || config.progress;
- origThen.apply(promise, [s, e, p]);
- return promise;
- };
- })(promise, promise.then);
-
- return promise;
- };
- }]);
- angularFileUpload.directive('ngFileSelect', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
- return function(scope, elem, attr) {
- var fn = $parse(attr['ngFileSelect']);
- elem.bind('change', function(evt) {
- var files = [], fileList, i;
- fileList = evt.target.files;
- if (fileList != null) {
- for (i = 0; i < fileList.length; i++) {
- files.push(fileList.item(i));
- }
- }
- $timeout(function() {
- fn(scope, {
- $files : files,
- $event : evt
- });
- });
- });
- elem.bind('click', function(){
- this.value = null;
- });
- };
- } ]);
- angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
- return function(scope, elem, attr) {
- if ('draggable' in document.createElement('span')) {
- var fn = $parse(attr['ngFileDropAvailable']);
- $timeout(function() {
- fn(scope);
- });
- }
- };
- } ]);
- angularFileUpload.directive('ngFileDrop', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
- return function(scope, elem, attr) {
- if ('draggable' in document.createElement('span')) {
- var fn = $parse(attr['ngFileDrop']);
- elem[0].addEventListener("dragover", function(evt) {
- evt.stopPropagation();
- evt.preventDefault();
- elem.addClass(attr['ngFileDragOverClass'] || "dragover");
- }, false);
- elem[0].addEventListener("dragleave", function(evt) {
- elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
- }, false);
- elem[0].addEventListener("drop", function(evt) {
- evt.stopPropagation();
- evt.preventDefault();
- elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
- var files = [], fileList = evt.dataTransfer.files, i;
- if (fileList != null) {
- for (i = 0; i < fileList.length; i++) {
- files.push(fileList.item(i));
- }
- }
- $timeout(function() {
- fn(scope, {
- $files : files,
- $event : evt
- });
- });
- }, false);
- }
- };
- } ]);
- })();
|