From 58514668410cb902dab613221a8e7f963cc36317 Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 26 Jul 2026 19:29:53 +0200 Subject: versioning fichiers CSS et JS --- public/js/file_upload.js | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 public/js/file_upload.js (limited to 'public/js/file_upload.js') diff --git a/public/js/file_upload.js b/public/js/file_upload.js new file mode 100644 index 0000000..737ca5f --- /dev/null +++ b/public/js/file_upload.js @@ -0,0 +1,101 @@ +// public/js/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'); + } +} -- cgit v1.2.3