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