UNPKG

ng-file-upload-haikulearning

Version:

An AngularJS directive for file upload using HTML5 with FileAPI polyfill for unsupported browsers

271 lines (239 loc) 11.3 kB
'use strict'; var app = angular.module('fileUpload', ['ngFileUpload']); var version = '11.0.0'; app.controller('MyCtrl', ['$scope', '$http', '$timeout', '$compile', 'Upload', function ($scope, $http, $timeout, $compile, Upload) { $scope.usingFlash = FileAPI && FileAPI.upload != null; //Upload.setDefaults({ngfKeep: true, ngfPattern:'image/*'}); $scope.changeAngularVersion = function () { window.location.hash = $scope.angularVersion; window.location.reload(true); }; $scope.angularVersion = window.location.hash.length > 1 ? (window.location.hash.indexOf('/') === 1 ? window.location.hash.substring(2) : window.location.hash.substring(1)) : '1.2.24'; $scope.invalidFiles = []; $scope.$watch('files', function (files) { $scope.formUpload = false; if (files != null) { if (!angular.isArray(files)) { $timeout(function () { $scope.files = files = [files]; }); return; } for (var i = 0; i < files.length; i++) { Upload.imageDimensions(files[i]).then(function (d) { $scope.d = d; }); $scope.errorMsg = null; (function (f) { $scope.upload(f, true); })(files[i]); } } }); $scope.uploadPic = function (file) { $scope.formUpload = true; if (file != null) { $scope.upload(file); } }; $scope.upload = function(file, resumable) { $scope.errorMsg = null; if ($scope.howToSend === 1) { uploadUsingUpload(file, resumable); } else if ($scope.howToSend == 2) { uploadUsing$http(file); } else { uploadS3(file); } }; $scope.isResumeSupported = Upload.isResumeSupported(); $scope.restart = function(file) { if (Upload.isResumeSupported()) { $http.get('https://angular-file-upload-cors-srv.appspot.com/upload?restart=true&name=' + encodeURIComponent(file.name)).then(function () { $scope.upload(file, true); }); } else { $scope.upload(file); } }; $scope.chunkSize = 100000; function uploadUsingUpload(file, resumable) { file.upload = Upload.upload({ url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(), resumeSizeUrl: resumable ? 'https://angular-file-upload-cors-srv.appspot.com/upload?name=' + encodeURIComponent(file.name) : null, resumeChunkSize: resumable ? $scope.chunkSize : null, headers: { 'optional-header': 'header-value' }, data: {username: $scope.username, file: file} }); file.upload.then(function (response) { $timeout(function () { file.result = response.data; }); }, function (response) { if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data; }, function (evt) { // Math.min is to fix IE which reports 200% sometimes file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); }); file.upload.xhr(function (xhr) { // xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false); }); } function uploadUsing$http(file) { file.upload = Upload.http({ url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(), method: 'POST', headers: { 'Content-Type': file.type }, data: file }); file.upload.then(function (response) { file.result = response.data; }, function (response) { if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data; }); file.upload.progress(function (evt) { file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); }); } function uploadS3(file) { file.upload = Upload.upload({ url: $scope.s3url, method: 'POST', data: { key: file.name, AWSAccessKeyId: $scope.AWSAccessKeyId, acl: $scope.acl, policy: $scope.policy, signature: $scope.signature, 'Content-Type': file.type === null || file.type === '' ? 'application/octet-stream' : file.type, filename: file.name, file: file } }); file.upload.then(function (response) { $timeout(function () { file.result = response.data; }); }, function (response) { if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data; }); file.upload.progress(function (evt) { file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); }); storeS3UploadConfigInLocalStore(); } $scope.generateSignature = function () { $http.post('/s3sign?aws-secret-key=' + encodeURIComponent($scope.AWSSecretKey), $scope.jsonPolicy). success(function (data) { $scope.policy = data.policy; $scope.signature = data.signature; }); }; if (localStorage) { $scope.s3url = localStorage.getItem('s3url'); $scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId'); $scope.acl = localStorage.getItem('acl'); $scope.success_action_redirect = localStorage.getItem('success_action_redirect'); $scope.policy = localStorage.getItem('policy'); $scope.signature = localStorage.getItem('signature'); } $scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host; $scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}'; $scope.acl = $scope.acl || 'private'; function storeS3UploadConfigInLocalStore() { if ($scope.howToSend === 3 && localStorage) { localStorage.setItem('s3url', $scope.s3url); localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId); localStorage.setItem('acl', $scope.acl); localStorage.setItem('success_action_redirect', $scope.success_action_redirect); localStorage.setItem('policy', $scope.policy); localStorage.setItem('signature', $scope.signature); } } (function handleDynamicEditingOfScriptsAndHtml($scope) { $scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '').replace(/&amp;/g, '&'); var fromLocal = (localStorage && localStorage.getItem('editHtml' + version)); $scope.editHtml = fromLocal || $scope.defaultHtml; function htmlEdit() { document.getElementById('editArea').innerHTML = $scope.editHtml; $compile(document.getElementById('editArea'))($scope); $scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml); if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml); } $scope.$watch('editHtml', htmlEdit); $scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), { lineNumbers: true, indentUnit: 4, mode: 'htmlmixed' }); $scope.htmlEditor.on('change', function () { if ($scope.editHtml != $scope.htmlEditor.getValue()) { $scope.editHtml = $scope.htmlEditor.getValue(); htmlEdit(); } }); })($scope, $http); $scope.confirm = function () { return confirm('Are you sure? Your local changes will be lost.'); }; $scope.getReqParams = function () { return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode + '&errorMessage=' + $scope.serverErrorMsg : ''; }; angular.element(window).bind('dragover', function (e) { e.preventDefault(); }); angular.element(window).bind('drop', function (e) { e.preventDefault(); }); $scope.modelOptionsObj = {}; $scope.$watch('validate+dragOverClass+modelOptions+resize+resizeIf', function (v) { $scope.validateObj = eval('(function(){return ' + $scope.validate + ';})()'); $scope.dragOverClassObj = eval('(function(){return ' + $scope.dragOverClass + ';})()'); $scope.modelOptionsObj = eval('(function(){return ' + $scope.modelOptions + ';})()'); $scope.resizeObj = eval('(function($file){return ' + $scope.resize + ';})()'); $scope.resizeIfFn = eval('(function(){var fn = function($file, $width, $height){return ' + $scope.resizeIf + ';};return fn;})()'); }); $timeout(function () { $scope.capture = localStorage.getItem('capture' + version) || 'camera'; $scope.pattern = localStorage.getItem('pattern' + version) || 'image/*,audio/*,video/*'; $scope.acceptSelect = localStorage.getItem('acceptSelect' + version) || 'image/*,audio/*,video/*'; $scope.modelOptions = localStorage.getItem('modelOptions' + version) || '{debounce:100}'; $scope.dragOverClass = localStorage.getItem('dragOverClass' + version) || '{accept:\'dragover\', reject:\'dragover-err\', pattern:\'image/*,audio/*,video/*,text/*\'}'; $scope.disabled = localStorage.getItem('disabled' + version) == 'true' || false; $scope.multiple = localStorage.getItem('multiple' + version) == 'true' || false; $scope.allowDir = localStorage.getItem('allowDir' + version) == 'true' || true; $scope.validate = localStorage.getItem('validate' + version) || '{size: {max: \'20MB\', min: \'10B\'}, height: {max: 12000}, width: {max: 12000}, duration: {max: \'5m\'}}'; $scope.keep = localStorage.getItem('keep' + version) == 'true' || false; $scope.keepDistinct = localStorage.getItem('keepDistinct' + version) == 'true' || false; $scope.orientation = localStorage.getItem('orientation' + version) == 'true' || false; $scope.resize = localStorage.getItem('resize' + version) || "{width: 1000, height: 1000, centerCrop: true}"; $scope.resizeIf = localStorage.getItem('resizeIf' + version) || "$width > 5000 || $height > 5000"; $scope.dimensions = localStorage.getItem('dimensions' + version) || "$width < 12000 || $height < 12000"; $scope.duration = localStorage.getItem('duration' + version) || "$duration < 10000"; $scope.$watch('validate+capture+pattern+acceptSelect+disabled+capture+multiple+allowDir+keep+orientation+' + 'keepDistinct+modelOptions+dragOverClass+resize+resizeIf', function () { localStorage.setItem('capture' + version, $scope.capture); localStorage.setItem('pattern' + version, $scope.pattern); localStorage.setItem('acceptSelect' + version, $scope.acceptSelect); localStorage.setItem('disabled' + version, $scope.disabled); localStorage.setItem('multiple' + version, $scope.multiple); localStorage.setItem('allowDir' + version, $scope.allowDir); localStorage.setItem('validate' + version, $scope.validate); localStorage.setItem('keep' + version, $scope.keep); localStorage.setItem('orientation' + version, $scope.orientation); localStorage.setItem('keepDistinct' + version, $scope.keepDistinct); localStorage.setItem('dragOverClass' + version, $scope.dragOverClass); localStorage.setItem('modelOptions' + version, $scope.modelOptions); localStorage.setItem('resize' + version, $scope.resize); localStorage.setItem('resizeIf' + version, $scope.resizeIf); }); }); }]);