1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
// public/file_upload.js
// envoie d'un gros fichier ZIP en contournant la limite du php.ini
// ce fichier est "caché", le serveur ne l'envoit 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 <input id="archiveUpload" type="file" >
var tagId = 'archiveUpload';
//var fileInfos = getFileInfo(tagId);
var file = document.getElementById(tagId).files[0];
// si le 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');
}
}
|