var j$ = jQuery.noConflict(); var filesList = []; var Base64 = {}; j$(document).ready(function() { //Event listener for click of Upload button j$("#uploadButton").click(function(){ prepareFileUploads(); removeClick(); }); //Event listener to clear upload details/status bars once upload is complete // j$("#clear").on('click',function(){ // j$(".upload").remove(); // }); //Event listener for click of Upload button j$("#removeFile").click(function(){ deleteFile(); }); removeNoClick(); }); var fileSize = 0; //判断需要上传的文件数量 var contrast = 0; //判断执行的文件数量 var bool = 'false'; //是否调用batch var byteChunkArray; var files; var currentFile; var $upload; var CHUNK_SIZE = 180000; //Must be evenly divisible by 3, if not, data corruption will occur var VIEW_URL = '/servlet/servlet.FileDownload?file='; var fileLength = 0; //var parentId, you will see this variable used below but it is set in the component as this is a dynamic value passed in by component attribute function removeNoClick(){ j$("#removeFile").css("pointer-events", "none").css("cursor", "default").css("opacity", "0.6"); } function removeClick(){ j$("#removeFile").css("pointer-events", "").css("cursor", "").css("opacity", ""); } function deleteFile(){ var files = j$('input[type="checkbox"]:checked'); var filesIdStr = ''; for(var i = 0 ; i < files.length ; i++){ if(files[i].value != '' && files[i].checked) filesIdStr += ',' + files[i].value; } filesIdStr = filesIdStr.substring(1); console.log('filesIdStr = ' + filesIdStr); BatchFileUploadController.deleteFile(filesIdStr,function(result,event){ console.log('result = ' + JSON.stringify(result)); if(result.status == 'success'){ for(var i = 0 ; i < files.length ; i++){ if(files[i].value != '' && files[i].checked){ files[i].nextSibling.children[3].children[2].children[0].innerHTML = '已删除该文件'; files[i].checked = false; files[i].hidden = true; } } //去AWS删除文件 AWSService.post(staticResource.deleteUrl,JSON.stringify(result.keyList),function(result){ console.log('result = ' + JSON.stringify(result)) },staticResource.token) }else{ alert('删除失败 : ' + result.message); } }); } //Executes when start Upload button is selected function prepareFileUploads(){ //Get the file(s) from the input field files = document.getElementById('filesInput').files; //Only proceed if there are files selected if(files.length == 0){ alert('Please select a file!'); return; //end function } //Disable inputs and buttons during the upload process j$(".uploadBox input").attr("disabled", "disabled"); j$(".uploadBox button").attr({ disabled: "disabled", class: "btnDisabled" }); //Build out the upload divs for each file selected var uploadMarkup = ''; for(i = 0; i < files.length; i++){ //Determine file display size if(files[i].size < 1000000){ var displaySize = Math.floor(files[i].size/1000) + 'K'; }else{ var displaySize = Math.round((files[i].size / 1000000)*10)/10 + 'MB'; } //For each file being uploaded create a div to represent that file, includes file size, status bar, etc. data-Status tracks status of upload uploadMarkup += ''; uploadMarkup += '
'; //index used to correspond these upload boxes to records in the files array uploadMarkup += '
'+ files[i].name + ' - '+ displaySize+ '
'; uploadMarkup += '
0%
' uploadMarkup += '
'; uploadMarkup += '
'; uploadMarkup += '
'; uploadMarkup += '
'+''+'
'; uploadMarkup += '
'; uploadMarkup += '
'; } //Add markup to the upload box j$('.uploadBox').append(uploadMarkup); //初始化 fileSize = 0; contrast = 0; bool = 'false'; //判断文件名与格式是否符合规则 for(i = 0; i < files.length; i++){ if(files[i].name.indexOf(' ') >= 0){ var $up = j$(".upload[data-index='"+(i+fileLength)+"']"); $up.prev().hide(); $up.first().attr('data-status','complete'); $up.first().addClass('uploadError'); $up.first().find(".statusPercent").addClass('statusPercentError'); $up.first().attr('title','不能上传有空格的文件'); j$(".upload[data-index='"+(i+fileLength)+"'] .errorMsg").text('不能上传有空格的文件'); //$upload.prev().css("disabled","disabled"); }else if(files[i].size > 15 *1024 *1024){ var $up = j$(".upload[data-index='"+(i+fileLength)+"']"); $up.prev().hide(); $up = j$(".upload[data-index='"+(i+fileLength)+"']"); $up.first().attr('data-status','complete'); $up.first().addClass('uploadError'); $up.first().find(".statusPercent").addClass('statusPercentError'); $up.first().attr('title','单个文件上传不能超过15M'); j$(".upload[data-index='"+(i+fileLength)+"'] .errorMsg").text('单个文件上传不能超过15M'); }else{ fileSize++; } } console.log('fileSize = ' + fileSize); fileLength += files.length; //Once elements have been added to the page representing the uploads, start the actual upload process checkForUploads(); } function checkForUploads(){ //Get div of the first matching upload element that is 'pending', if none, all uploads are complete //$upload = j$(".upload:first[data-status='pending']"); $upload = j$(".upload[data-status='pending']").first(); if($upload.length != 0){ //Based on index of the div, get correct file from files array currentFile = files[($upload.attr('data-index') - fileLength + files.length)]; /*Build the byteChunkArray array for the current file we are processing. This array is formatted as: ['0-179999','180000-359999',etc] and represents the chunks of bytes that will be uploaded individually.*/ byteChunkArray = new Array(); //First check to see if file size is less than the chunk size, if so first and only chunk is entire size of file if(currentFile.size <= CHUNK_SIZE){ byteChunkArray[0] = '0-' + (currentFile.size - 1); }else{ //Determine how many whole byte chunks make up the file, var numOfFullChunks = Math.floor(currentFile.size / CHUNK_SIZE); //i.e. 1.2MB file would be 1000000 / CHUNK_SIZE var remainderBytes = currentFile.size % CHUNK_SIZE; // would determine remainder of 1200000 bytes that is not a full chunk var startByte = 0; var endByte = CHUNK_SIZE - 1; //Loop through the number of full chunks and build the byteChunkArray array for(i = 0; i < numOfFullChunks; i++){ byteChunkArray[i] = startByte+'-'+endByte; //Set new start and stop bytes for next iteration of loop startByte = endByte + 1; endByte += CHUNK_SIZE; } //Add the last chunk of remaining bytes to the byteChunkArray startByte = currentFile.size - remainderBytes; endByte = currentFile.size; byteChunkArray.push(startByte+'-'+endByte); } //Start processing the byteChunkArray for the current file, parameter is '' because this is the first chunk being uploaded and there is no attachment Id processByteChunkArray(''); }else{ //All uploads completed, enable the input and buttons j$(".uploadBox input").removeAttr("disabled"); j$(".uploadBox button").removeAttr("disabled").attr("class","btn"); /*Remove the browse input element and replace it, this essentially removes the selected files and helps prevent duplicate uploads*/ j$("#filesInput").replaceWith(''); } } function processByteChunkArray(){ try{ //Proceed if there are still values in the byteChunkArray, if none, all piece of the file have been uploaded console.log('byteChunkArray.length = ' + byteChunkArray.length); if(byteChunkArray.length > 0){ //Determine the byte range that needs to uploaded, if byteChunkArray is like... ['0-179999','180000-359999'] console.log('byteChunkArray[0] = ' + byteChunkArray[0]); var indexes = byteChunkArray[0].split('-'); //... get the first index range '0-179999' -> ['0','179999'] var startByte = parseInt(indexes[0]); //0 var stopByte = parseInt(indexes[1]); //179999 //Slice the part of the file we want to upload, currentFile variable is set in checkForUploads() method that is called before this method if(currentFile.slice){ var blobChunk = currentFile.slice(startByte , stopByte + 1); }else if (currentFile.mozSlice) { var blobChunk = currentFile.mozSlice(startByte , stopByte + 1); } console.log('stopByte = ' + stopByte); console.log('currentFile.size = ' + currentFile.size); //Update the percent of the status bar and percent, first determine percent complete if(stopByte + 1 >= currentFile.size){ debugger contrast++; console.log('contrast = ' + contrast); if(contrast >= fileSize){ bool = 'true'; } console.log('bool = ' + bool); //Create a new reader object, part of HTML5 File API var reader = new FileReader(); blobChunk = currentFile.slice(0 , stopByte + 1); //Read the blobChunk as a binary string, reader.onloadend function below is automatically called after this line reader.readAsDataURL(blobChunk); //Create a reader.onload function, this will execute immediately after reader.readAsBinaryString() function above; reader.onloadend = function(evt){ if(evt.target.readyState == FileReader.DONE){ //Make sure read was successful, DONE == 2 //Base 64 encode the data for transmission to the server with JS remoting, window.btoa currently on support by some browsers //var base64value = window.btoa(evt.target.result); var base64value = evt.target.result; Base64.file = base64value; Base64.fileName = currentFile.name; Base64.size = currentFile.size; filesList = []; filesList.push(Base64); AWSService.post(newUrl, JSON.stringify(filesList), function(result){ result = JSON.parse(JSON.stringify(result)); if(result.status == '0'){ //Use js remoting to send the base64 encoded chunk for uploading let key = result.object[0]; let transId = result.txId; BatchFileUploadController.saveFile(currentFile.name,key,transId,parentId,bool,function(result,event){ //Proceed if there were no errors with the remoting call if(result.status == 'success'){ //执行trans方法,进行确认成功 trans(currentFile.name,transId,1); //Update the percent of the status bar and percent, first determine percent complete var percentComplete = Math.round((stopByte / currentFile.size) * 100); $upload.find(".percentComplete").text(percentComplete + '%'); $upload.find(".statusBarPercent").css('width',percentComplete + '%'); //Remove the index information from the byteChunkArray array for the piece just uploaded. byteChunkArray.shift(); //removes 0 index //Call process byteChunkArray to upload the next piece of the file $upload.prev().val(result.recordId); processByteChunkArray(); }else{ //执行trans方法,进行确认失败 trans(currentFile.name,transId,0); //If script is here something broke on the JavasSript remoting call //Add classes to reflect error $upload.attr('data-status','complete'); $upload.addClass('uploadError'); $upload.find(".statusPercent").addClass('statusPercentError'); $upload.attr('title',result.message); $upload.find(".errorMsg").text(result.message); $upload.find(".percentComplete").text(0 + '%'); $upload.find(".statusBarPercent").css('width',0 + '%'); $upload.prev().hide(); //Check and continue the next file to upload checkForUploads(); } }); }else{ $upload.attr('data-status','complete'); $upload.addClass('uploadError'); $upload.find(".statusPercent").addClass('statusPercentError'); $upload.attr('title',result.message); $upload.find(".errorMsg").text(result.message); $upload.find(".percentComplete").text(0 + '%'); $upload.find(".statusBarPercent").css('width',0 + '%'); $upload.prev().hide(); checkForUploads(); } }, staticResource.token,function(error){ //alert('AWS文件上传出现错误,请刷新页面重试'); $upload.attr('data-status','complete'); $upload.addClass('uploadError'); $upload.find(".statusPercent").addClass('statusPercentError'); $upload.attr('title','AWS文件上传出现错误,请重新上传该文件'); $upload.find(".errorMsg").text('AWS文件上传出现错误,请重新上传该文件'); $upload.find(".percentComplete").text(0 + '%'); $upload.find(".statusBarPercent").css('width',0 + '%'); $upload.prev().hide(); checkForUploads(); }); }else{ //Error handling for bad read alert('Could not read file'); } }; }else{ var percentComplete = Math.round((stopByte / currentFile.size) * 100); $upload.find(".percentComplete").text(percentComplete + '%'); $upload.find(".statusBarPercent").css('width',percentComplete + '%'); //Remove the index information from the byteChunkArray array for the piece just uploaded. byteChunkArray.shift(); //removes 0 index //Call process byteChunkArray to upload the next piece of the file processByteChunkArray(); } }else{ //This file has completed, all byte chunks have been uploaded, set status on the div to complete $upload.attr('data-status','complete'); //Change name of file to link of uploaded attachment //$upload.find(".name").html(''+currentFile.name+''); //Call the checkForUploads to find the next upload div that has data-status="incomplete" and start the upload process. checkForUploads(); } }catch(err){ alert('发送错误' + err.message + '请刷新页面'); } } function trans(fileName,txId,isSuccess){ let transParameters = { txId: txId, isSuccess: isSuccess }; console.log('txId = ' + txId); AWSService.confirmTrans(staticResource.updateUrl,JSON.stringify(transParameters),function(result){ console.log(fileName); console.log(JSON.stringify(result)) },staticResource.token) }