unserver-unify
Version:
390 lines (387 loc) • 13 kB
JavaScript
'use strict';
angular.module('bamboo').controller('alicloudUploadCtrl', function($scope, $sce, $location, $timeout, $uibModal, setting, $uibModalInstance, FileUploader, ApiService, LocalConfig, $window, $rootScope) {
var self = this;
self.errmsg = '';
$scope.setting = setting;
$scope.validupload = true;
var lookupFound=false;
var lookupFile=setting.lookupFile;
var directory;
var url = '//' + LocalConfig.OSSSERVER + '/resupload';
if(LocalConfig.OSSSERVER.charAt(0)=='/'){
url=LocalConfig.OSSSERVER+'/resupload';
}
var _protocol = window.location.protocol;
if(setting.apiUrl){
var url = '//' + LocalConfig.OSSSERVER + setting.apiUrl;
if(LocalConfig.OSSSERVER.charAt(0)=='/'){
url=LocalConfig.OSSSERVER+setting.apiUrl;
}
}else if (_protocol.indexOf('https') > -1) {
this.allowmedia = true;
if (LocalConfig.HTTPSFILESERVER) {
url = LocalConfig.HTTPSFILESERVER + '/resupload';
}
} else if ($location.host().indexOf('localhost') > -1) {
this.allowmedia = true;
}
var filenumbers = 0;
var selectedFileName;
var uploader = $scope.uploader = new FileUploader({
url: url,
// queueLimit: 10,
// withCredentials: true
});
var _info = {
action: setting.action,
path: setting.resPath,
};
if (setting.randomFlag) {
_info.random = setting.randomFlag;
}
if (setting.multiple) {
_info.multiple = true;
}
if(setting.directory){
_info.directory = true;
}
if (setting.id) {
_info.id = setting.id;
}
if (setting.srtConvert) {
_info.convert = 'srt2vtt';
}
uploader.formData.push(_info);
$scope.nameDurations = {};
$scope.nameBitRate = {};
this._selectedMultifile = function(files) {
console.log(files);
}
$scope.config = {
preload: "none",
sources: [{
//src: $sce.trustAsResourceUrl("http://static.videogular.com/assets/videos/videogular.mp4"),
src: null,
type: "video/mp4"
}],
tracks: [{
//src: "http://www.videogular.com/assets/subs/pale-blue-dot.vtt",
kind: "subtitles",
srclang: "en",
label: "English",
default: ""
}],
theme: {
url: "http://www.videogular.com/styles/themes/default/latest/videogular.css"
}
};
function dataURLtoBlob(dataurl, filename) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new Blob([u8arr], {
type: mime
});
blob.name = filename;
blob.lastModifiedDate = new Date();
return blob;
}
function handleCompressedImage() {
// $scope.validupload = false;
if (!self.imageobj) {
$timeout(handleCompressedImage, 200)
return;
}
// console.log(self.imageobj);
var filename = (new Date()).getTime().toString() + ".jpg";
var data = self.imageobj.compressed.dataURL;
var tempfile = dataURLtoBlob(data, filename);
console.log(tempfile);
var files = [tempfile];
uploader.addToQueue(files);
// $scope.selectedFile =tempfile;
// $scope.selectedFile=self.imageobj.compressed.dataURL;
// $scope.selectedFile.duration = null; // set null duration to single no-mp4 file
// $scope.validupload = true; // enable the upload button for othe format
}
$scope.imageUploaded = function() {
console.log("--- uploaded ---");
self.imageobj = null;
// console.log(self.imageobj);
handleCompressedImage();
}
$scope.convertSrt = function() {}
this.remove = function(index) {
uploader.removeFromQueue(index);
}
uploader.onAfterAddingFile = function(fileItem) {
self.previewVideoSrc = null;
self.needConvert = false;
self.currentFile = fileItem.file;
console.log("file updated");
// console.log(fileItem);
if (!setting.multiple && uploader.queue.length > 1) { // if only single upload
var _temp = uploader.queue[uploader.queue.length - 1];
uploader.queue = [];
uploader.queue.push(_temp);
}
// check if we need to show thumb (only for img file)
if (fileItem.file.type.indexOf("image") != -1) {
fileItem.file.isImage = true;
}
//check file size
if (fileItem.file.size > setting.maxSize * 1024) {
self.errmsg = fileItem.file.name + ' size : ' + fileItem.file.size + ' > ' + setting.maxSize + 'KB';
var msg = fileItem.file.name + ' size : ' + fileItem.file.size + ' > ' + setting.maxSize + 'KB';
fileItem.errmsg = msg;
}else{
fileItem.errmsg = "";
}
//find the duration for mp4 file, and also set duration to null for no-mp4 file
var _filename = fileItem._file.name;
var _ext = _filename.split('.');
var _extl = _ext[_ext.length - 1];
// console.log(_extl);
if (_extl == 'mp4' || _extl == "webm") {
var previewImageSrc = URL.createObjectURL(fileItem._file);
var video = document.createElement('video');
video.src = previewImageSrc;
video.preload = 'metadata';
video.name = fileItem._file.name;
// event will triggered when meta data was loaded
video.onloadedmetadata = function() {
// console.log(this.duration);
// console.log(this.videoHeight);
// console.log(fileItem.file.size);
$scope.nameDurations[this.name] = this.duration;
$scope.nameBitRate[this.name] = false;
if (this.duration) {
var bitrate = fileItem.file.size / this.duration;
if (bitrate > 150000) {
console.log(bitrate);
$scope.nameBitRate[this.name] = true;
}
}
if (!$scope.$$phase) {
$scope.$apply();
}
};
if (!setting.multiple) {
//self.previewVideoSrc = $sce.trustAsResourceUrl(previewImageSrc);
self.previewVideoSrc = $sce.trustAsResourceUrl(previewImageSrc);
console.log(fileItem._file);
$scope.config.sources[0].src = URL.createObjectURL(fileItem._file);
}
} else {
// console.log("--- convert needed ---");
// console.log(fileItem);
if (setting.accept == '.mp4') {
console.log("--- convert needed ---");
self.needConvert = true;
}
self.oldFileName = fileItem._file.name;
}
if (uploader.queue.length > 1 && !setting.multiple) {
uploader.removeFromQueue(0);
} else if (setting.directory) {
// console.log(uploader.queue);
// console.log(fileItem._file);
var files = fileItem._file;
// console.log(files.webkitRelativePath);
var fullpath = files.webkitRelativePath;
// console.log(files.name);
if(lookupFile&&lookupFile.indexOf(files.name)>-1){
console.log('-- lookup found --');
lookupFound=true;
}
var refname = '/' + files.name;
var pos = fullpath.indexOf(refname);
var _directory = fullpath.substring(0, pos);
var _directory = _directory.split(' ').join("_");
// console.log(_directory);
if (uploader.queue.length == 1) {
directory = _directory;
}
var index = uploader.queue.length;
// console.log(uploader.queue[index - 1].formData[0].path);
uploader.queue[index - 1].formData[0].path = uploader.queue[index - 1].formData[0].path + _directory + "/";
// console.log(uploader.queue[index - 1].formData[0].path);
}
filenumbers = uploader.queue.length;
selectedFileName = uploader.queue[0].file.name;
};
if ($scope.setting.selectedFile) { // load file from setting if available
uploader.addToQueue($scope.setting.selectedFile);
}
this.convertMp4 = function() {
if (!setting.id && setting.idcallback) {
setting.idcallback(self.currentFile.name, function(result) {
console.log(result);
var id = result._id;
$scope.setting.id = id;
_convertmp4(id);
})
} else {
_convertmp4(setting.id);
}
}
function _convertmp4(id) {
// console.log(uploader);
var url = '//' + LocalConfig.OSSSERVER + '/mp4convert';
if(LocalConfig.OSSSERVER.charAt(0)=='/'){
url=LocalConfig.OSSSERVER+'/mp4convert';
}
if (LocalConfig.HTTPSFILESERVER) {
url = LocalConfig.HTTPSFILESERVER + '/mp4convert';
}
uploader.url = url;
for (var i = 0; i < uploader.queue.length; i++) {
var item = uploader.queue[i];
item.url = url;
item.formData[0].id = id;
}
console.log(uploader);
uploader.uploadAll();
}
var filedone = 0;
var filelist = [];
var failed = [];
uploader.onCompleteItem = function(item, response) {
console.log(response);
if (!response) {
return;
}
if (response.success) {
filedone++;
var info = {
result: response.fileName,
source: response.originame,
filesize: item.file.size, // return file size for successfully uploaded file, NOTICED, this API name must be aligned along other uploaders
duration: $scope.nameDurations[item.file.name] || null // return duration, MUST be the same API as others uplaoder
};
filelist.push(info);
if (filedone >= filenumbers) {
// console.log("return here");
var _info = {
result: true,
message: 'Update Successful!',
list: response.list,
directory: directory,
pass: filelist,
fileName: response.fileName,
source: response.originame,
origin: selectedFileName,
dataresult:response.result,
lookupFound:lookupFound,
}
if (self.needConvert) {
console.log("--- need convert ? ---");
_info.source = self.oldFileName;
_info.convertFlag = true;
_info.rid = $scope.setting.id;
}
console.log(info);
$uibModalInstance.close(_info);
}
} else {
if (!item.resent) {
item.resent = true;
item.upload();
} else {
filedone++;
failed.push(item.file.name);
if (filedone >= filenumbers) {
$uibModalInstance.close({
result: filelist.length > 0 ? true : false,
message: response.error,
pass: filelist,
fail: failed
});
} else {
// do nothing as it doesn't finish upload all
}
}
}
};
uploader.onProgressItem = function(item, progress) {
$rootScope.$storage.idleTime = 0; //keep resetting the timeout counter when uploader is working
if (setting.convertFlag) {
if (progress > 95) {
$scope.convertflag = true;
}
}
//console.log(progress);
//console.log(item);
};
$scope.recordvoice = function() {
console.log(" record ---");
var r = $uibModal.open({
templateUrl: 'components/upload/audio_dialog.html',
controller: 'AudioRecordCtrl',
controllerAs: 'ctrl',
backdrop: 'static',
}).result;
r.then(function(data) {
if (data.result) {
var url = '//' + LocalConfig.OSSSERVER + '/mp3convert';
if(LocalConfig.OSSSERVER.charAt(0)=='/'){
url=LocalConfig.OSSSERVER+'/mp3convert';
}
if (LocalConfig.HTTPSFILESERVER) {
url = LocalConfig.HTTPSFILESERVER + '/mp3convert';
}
//console.log(data.file);
// uploader.formData[0].path="";
// uploader
uploader.url=url;
uploader.formData[0].directUpload=true;
uploader.addToQueue(data.file);
//console.log(uploader);
uploader.uploadAll();
console.log(uploader);
//$scope.uploadS3File(data.file);
}
});
};
$scope.recordvideo = function() {
var r = $uibModal.open({
templateUrl: 'components/upload/video_dialog.html',
controller: 'VideoRecordCtrl',
controllerAs: 'ctrl',
backdrop: 'static',
}).result;
r.then(function(data) {
if (data.result) {
// uploader.formData[0].path="";
uploader.formData[0].directUpload=true;
uploader.addToQueue(data.file);
console.log(uploader);
_convertmp4();
// uploader.uploadAll();
}
});
};
$scope.shootPhoto = function() {
var r = $uibModal.open({
templateUrl: 'components/upload/photo_dialog.html',
controller: 'PhotoShootCtrl',
controllerAs: 'ctrl',
backdrop: 'static',
}).result;
r.then(function(data) {
if (data.result) {
uploader.addToQueue(data.file);
uploader.uploadAll();
}
});
};
$scope.dismiss = function() {
$scope.uploader.cancelAll();
$uibModalInstance.dismiss();
}
});