|      | 
|     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 += '<input type="checkbox" name="interest" style="float:left;margin-top:30px" value="" class="checkbox">'; | 
|             uploadMarkup += '<div class="upload" style="margin-top:20px;width:90%;margin-left:5%;" data-status="pending" data-index="'+(i+fileLength)+'">'; //index used to correspond these upload boxes to records in the files array | 
|             uploadMarkup += '<div class="fileName"><span class="name">'+ files[i].name + '</span> - '+ displaySize+ '</div>'; | 
|             uploadMarkup += '<div class="percentComplete">0%</div>' | 
|             uploadMarkup += '<div class="clear"/>'; | 
|             uploadMarkup += '<div class="statusBar">'; | 
|             uploadMarkup += '<div class="statusBarPercent"/>'; | 
|             uploadMarkup += '<br><div class="errorMsgDiv" style="margin-top:5px"><span class="errorMsg" style="color:red;margin-top:5px">'+'</span>'+'</div>'; | 
|             uploadMarkup += '</div>'; | 
|             uploadMarkup += '</div>'; | 
|   | 
|              | 
|         } | 
|          | 
|         //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('<input type="file" name="file" multiple="true" id="filesInput">'); | 
|         } | 
|     } | 
|      | 
|     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('<a href="' + VIEW_URL + attachmentId + '" target="_blank">'+currentFile.name+'</a>'); | 
|                 //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) | 
|     } |