summaryrefslogtreecommitdiff
path: root/public/file_upload.js
blob: 8106806daa827784206b452533a379718d729452 (plain)
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 gros fichier ZIP
// 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');
	}
}