// public/file_upload.js // // envoie d'un gros fichier ZIP en contournant la limite du php.ini // ce fichier est "caché", il n'est envoyé qu'à un utilisateur connecté et sur la page "restauration" // -> input file onchange function sendFileSize() { var tagId = 'archiveUpload'; var fileInfos = getFileInfo(tagId); //var fileSize = document.getElementById(tagId).files[0].size; const xhr = new XMLHttpRequest(); url = 'index.php?action=restauration&file_name='+fileInfos.name+'&file_size='+fileInfos.size; xhr.open("GET", url); xhr.send(); } // -> input submit onclick function uploadDespiteServerMaxWeightLimit(maxPHPiniWeight, archiveFormat) { // dans var tagId = 'archiveUpload'; //var fileInfos = getFileInfo(tagId); var file = document.getElementById(tagId).files[0]; // si le fichier est assez léger, javascript s'arrête ici if(file.size > maxPHPiniWeight) { // découpage // envoyer et recevoir des pointeurs pour les perfs // chunksArray est un tableau de "blob" var nbChunks = Math.ceil(file.size / maxPHPiniWeight); var chunksArray = sliceFile(file, nbChunks); // requêtes AJAX chunkIndex = 0; // une variable globale uploadChunksAJAX(chunksArray, tagId); // annule l'envoi normal par POST event.preventDefault(); // vider le formulaire et recharger // reload() est un F5 et non un Ctrl + F5 //document.getElementById(tagId).value = ''; //location.reload(); location.href = "index.php?from=menu&action=restauration"; } } function getFileInfo(tagId) { var infos = { name: document.getElementById(tagId).files[0].name, size: document.getElementById(tagId).files[0].size, type: document.getElementById(tagId).files[0].type, } return(infos); } function sliceFile(file, nbChunks) { var byteIndex = 0; // octet du début var chunks = []; // données for (var i = 0; i < nbChunks; i += 1) { // octet de fin var byteEnd = Math.ceil((file.size / nbChunks) * (i + 1)); // un morceau du fichier va dans une case du tableau chunks.push(file.slice(byteIndex, byteEnd)); // nouvel octet du début byteIndex += (byteEnd - byteIndex); } return chunks; } function uploadChunksAJAX(chunksArray, tagId) { var fileName = document.getElementById(tagId).files[0].name; var formData = new FormData(); const xhr = new XMLHttpRequest(); for(var i = 0; i < chunksArray.length; i++) { formData.append('blob', chunksArray[i]); url = 'index.php?from=menu&action=restauration&chunk_name='+fileName+'_'+i; // false => synchrone, déprécié parce que fige le navigateur, mais ici on s'en fout xhr.open("POST", url, false); xhr.send(formData); formData.delete('blob'); } }