summaryrefslogtreecommitdiff
path: root/public/js/file_upload.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/js/file_upload.js')
-rw-r--r--public/js/file_upload.js101
1 files changed, 101 insertions, 0 deletions
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 @@
1// public/js/file_upload.js
2//
3// envoie d'un gros fichier ZIP en contournant la limite du php.ini
4// ce fichier est "caché", il n'est envoyé qu'à un utilisateur connecté et sur la page "restauration"
5
6// -> input file onchange
7function sendFileSize()
8{
9 var tagId = 'archiveUpload';
10 var fileInfos = getFileInfo(tagId);
11 //var fileSize = document.getElementById(tagId).files[0].size;
12
13 const xhr = new XMLHttpRequest();
14 url = 'index.php?action=restauration&file_name='+fileInfos.name+'&file_size='+fileInfos.size;
15 xhr.open("GET", url);
16 xhr.send();
17}
18
19// -> input submit onclick
20function uploadDespiteServerMaxWeightLimit(maxPHPiniWeight, archiveFormat)
21{
22 // dans <input id="archiveUpload" type="file" >
23 var tagId = 'archiveUpload';
24 //var fileInfos = getFileInfo(tagId);
25 var file = document.getElementById(tagId).files[0];
26
27 // si le fichier est assez léger, javascript s'arrête ici
28 if(file.size > maxPHPiniWeight)
29 {
30 // découpage
31 // envoyer et recevoir des pointeurs pour les perfs
32 // chunksArray est un tableau de "blob"
33 var nbChunks = Math.ceil(file.size / maxPHPiniWeight);
34 var chunksArray = sliceFile(file, nbChunks);
35
36 // requêtes AJAX
37 chunkIndex = 0; // une variable globale
38 uploadChunksAJAX(chunksArray, tagId);
39
40 // annule l'envoi normal par POST
41 event.preventDefault();
42
43 // vider le formulaire et recharger
44 // reload() est un F5 et non un Ctrl + F5
45 //document.getElementById(tagId).value = '';
46 //location.reload();
47
48 location.href = "index.php?from=menu&action=restauration";
49 }
50}
51
52function getFileInfo(tagId)
53{
54 var infos =
55 {
56 name: document.getElementById(tagId).files[0].name,
57 size: document.getElementById(tagId).files[0].size,
58 type: document.getElementById(tagId).files[0].type,
59 }
60
61 return(infos);
62}
63
64function sliceFile(file, nbChunks)
65{
66 var byteIndex = 0; // octet du début
67 var chunks = []; // données
68
69 for (var i = 0; i < nbChunks; i += 1)
70 {
71 // octet de fin
72 var byteEnd = Math.ceil((file.size / nbChunks) * (i + 1));
73
74 // un morceau du fichier va dans une case du tableau
75 chunks.push(file.slice(byteIndex, byteEnd));
76
77 // nouvel octet du début
78 byteIndex += (byteEnd - byteIndex);
79 }
80
81 return chunks;
82}
83
84function uploadChunksAJAX(chunksArray, tagId)
85{
86 var fileName = document.getElementById(tagId).files[0].name;
87 var formData = new FormData();
88 const xhr = new XMLHttpRequest();
89
90 for(var i = 0; i < chunksArray.length; i++)
91 {
92 formData.append('blob', chunksArray[i]);
93
94 url = 'index.php?from=menu&action=restauration&chunk_name='+fileName+'_'+i;
95 // false => synchrone, déprécié parce que fige le navigateur, mais ici on s'en fout
96 xhr.open("POST", url, false);
97 xhr.send(formData);
98
99 formData.delete('blob');
100 }
101}