This repository has been archived on 2022-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
AriaNg/src/scripts/services/ariaNgFileService.js

200 lines
7.1 KiB
JavaScript
Raw Normal View History

2016-06-23 18:39:18 +02:00
(function () {
'use strict';
angular.module('ariaNg').factory('ariaNgFileService', ['$window', function ($window) {
2016-06-26 15:40:56 +02:00
var isSupportFileReader = !!$window.FileReader;
var isSupportBlob = !!$window.Blob;
2016-06-23 18:39:18 +02:00
var getAllowedExtensions = function (fileFilter) {
var extensions = [];
if (!fileFilter || fileFilter.length < 1) {
extensions.push(/.+$/);
return extensions;
}
var fileFilters = fileFilter.split(',');
for (var i = 0; i < fileFilters.length; i++) {
var extension = fileFilters[i];
2016-08-01 19:26:10 +02:00
if (extension === '*.*') {
2016-06-23 18:39:18 +02:00
extensions.push(/.+$/);
continue;
}
extension = extension.replace('.', '\\.');
extension = extension + '$';
extensions.push(new RegExp(extension));
}
return extensions;
};
var checkFileExtension = function (fileName, extensions) {
if (!extensions || extensions.length < 1) {
return true;
}
for (var i = 0; i < extensions.length; i++) {
if (extensions[i].test(fileName)) {
return true;
}
}
return false;
};
return {
isSupportFileReader: function () {
return isSupportFileReader;
},
isSupportBlob: function () {
return isSupportBlob;
},
openFileContent: function (options, successCallback, errorCallback, element) {
2016-06-23 18:39:18 +02:00
if (!isSupportFileReader) {
if (errorCallback) {
errorCallback('Your browser does not support loading file!');
}
2016-06-23 18:39:18 +02:00
return;
}
options = angular.extend({
2019-03-27 15:44:40 +01:00
scope: null,
fileFilter: null,
2019-03-27 15:44:40 +01:00
fileType: 'binary', // or 'text'
successCallback: successCallback,
errorCallback: errorCallback
}, options);
2018-05-09 18:42:09 +02:00
if (!element || !element.change) {
element = angular.element('<input type="file" style="display: none"/>');
}
2019-03-27 15:44:40 +01:00
element.data('options', options);
if (options.fileFilter) {
element.attr('accept', options.fileFilter);
}
element.val('');
2018-05-09 18:42:09 +02:00
if (element.attr('data-ariang-file-initialized') !== 'true') {
element.change(function () {
if (!this.files || this.files.length < 1) {
return;
}
2019-03-27 15:44:40 +01:00
var thisOptions = element.data('options');
var allowedExtensions = getAllowedExtensions(thisOptions.fileFilter);
2018-05-09 18:42:09 +02:00
var file = this.files[0];
var fileName = file.name;
2016-06-23 18:39:18 +02:00
2018-05-09 18:42:09 +02:00
if (!checkFileExtension(fileName, allowedExtensions)) {
2019-03-27 15:44:40 +01:00
if (thisOptions.errorCallback) {
if (thisOptions.scope) {
thisOptions.scope.$apply(function () {
thisOptions.errorCallback('The selected file type is invalid!');
});
} else {
thisOptions.errorCallback('The selected file type is invalid!');
}
2018-05-09 18:42:09 +02:00
}
2016-06-23 18:39:18 +02:00
2018-05-09 18:42:09 +02:00
return;
}
2018-05-09 18:42:09 +02:00
var reader = new FileReader();
2016-06-23 18:39:18 +02:00
2018-05-09 18:42:09 +02:00
reader.onload = function () {
var result = {
fileName: fileName
2018-05-09 18:42:09 +02:00
};
2016-06-23 18:39:18 +02:00
2019-03-27 15:44:40 +01:00
switch (thisOptions.fileType) {
case 'text':
result.content = this.result;
break;
case 'binary':
default:
result.base64Content = this.result.replace(/.*?base64,/, '');
break;
}
2019-03-27 15:44:40 +01:00
if (thisOptions.successCallback) {
if (thisOptions.scope) {
thisOptions.scope.$apply(function () {
thisOptions.successCallback(result);
});
} else {
thisOptions.successCallback(result);
}
2018-05-09 18:42:09 +02:00
}
2016-06-23 18:39:18 +02:00
};
2018-05-09 18:42:09 +02:00
reader.onerror = function () {
2019-03-27 15:44:40 +01:00
if (thisOptions.errorCallback) {
if (thisOptions.scope) {
thisOptions.scope.$apply(function () {
thisOptions.errorCallback('Failed to load file!');
});
} else {
thisOptions.errorCallback('Failed to load file!');
}
2018-05-09 18:42:09 +02:00
}
};
2016-06-23 18:39:18 +02:00
2019-03-27 15:44:40 +01:00
switch (thisOptions.fileType) {
case 'text':
reader.readAsText(file);
break;
case 'binary':
default:
reader.readAsDataURL(file);
break;
}
2018-05-09 18:42:09 +02:00
}).attr('data-ariang-file-initialized', 'true');
}
2016-06-23 18:39:18 +02:00
2018-05-09 18:42:09 +02:00
element.trigger('click');
},
saveFileContent: function (content, element, options) {
if (!isSupportBlob) {
return;
}
options = angular.extend({
fileName: null,
contentType: 'application/octet-stream',
autoTrigger: false,
autoRevoke: false
}, options);
var blob = new Blob([content], { type: options.contentType });
var objectUrl = URL.createObjectURL(blob);
if (!element) {
element = angular.element('<a style="display: none"/>');
}
element.attr('href', objectUrl);
if (options.fileName) {
element.attr('download', options.fileName);
}
if (options.autoTrigger) {
element.trigger('click');
}
if (options.autoRevoke) {
URL.revokeObjectURL(objectUrl);
}
2016-06-23 18:39:18 +02:00
}
2016-12-10 18:50:25 +01:00
};
2016-06-23 18:39:18 +02:00
}]);
2016-08-01 16:49:16 +02:00
}());