From 3747a71c10ae9df21f72bd2930b7dfcf5aa258b1 Mon Sep 17 00:00:00 2001 From: Matthieu Marcillaud Date: Tue, 14 Dec 2021 09:22:48 +0100 Subject: [PATCH] =?UTF-8?q?Ticket=20#4851=20:=20Pour=20v=C3=A9rifier=20c?= =?UTF-8?q?=C3=B4t=C3=A9=20PHP=20que=20le=20nombre=20de=20morceaux=20de=20?= =?UTF-8?q?fichiers=20re=C3=A7u=20est=20corrects,=20on=20utilise=20le=20no?= =?UTF-8?q?mbre=20de=20chunks=20envoy=C3=A9=20par=20flow.js=20plut=C3=B4t?= =?UTF-8?q?=20que=20de=20tenter=20de=20le=20calculer=20soi-m=C3=AAme.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Effectivement 1) notre calcul était étonnamment erroné dans certains cas (notamment sur le fichiers qui avaient une division entière entre leur taille et la taille des morceaux) 2) la lib js a une option (forceChunkSize) qui peut modifier le calcul Du coup, on ne calcule plus le nombre attendu en PHP, on utilise celui de flow. On vérifie cependant, si tous les morceaux sont là, que leur taille totale des morceaux récupérés est celle attendue par le fichier. --- inc/Bigup/Flow.php | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/inc/Bigup/Flow.php b/inc/Bigup/Flow.php index 15af801..7330919 100644 --- a/inc/Bigup/Flow.php +++ b/inc/Bigup/Flow.php @@ -166,7 +166,7 @@ class Flow { public function handleTestChunk() { $identifier = $this->_request('identifier'); $filename = $this->_request('filename'); - $chunkNumber = $this->_request('chunkNumber'); + $chunkNumber = (int) $this->_request('chunkNumber'); $this->info("Test chunk $identifier n°$chunkNumber"); @@ -186,9 +186,10 @@ class Flow { public function handleChunk() { $identifier = $this->_request('identifier'); $filename = $this->_request('filename'); - $chunkNumber = $this->_request('chunkNumber'); - $chunkSize = $this->_request('chunkSize'); - $totalSize = $this->_request('totalSize'); + $chunkNumber = (int) $this->_request('chunkNumber'); + $chunkSize = (int) $this->_request('chunkSize'); + $totalChunks = (int) $this->_request('totalChunks'); + $totalSize = (int) $this->_request('totalSize'); $maxSize = $this->maxSizeFile * 1024 * 1024; $this->info("Réception chunk $identifier n°$chunkNumber"); @@ -212,7 +213,7 @@ class Flow { } // tous les morceaux recus ? - if ($this->isFileUploadComplete($filename, $identifier, $chunkSize, $totalSize)) { + if ($this->isFileUploadComplete($filename, $identifier, $totalSize, $totalChunks)) { $this->info("Chunks complets de $identifier"); $chemin_parts = $this->cache->parts->fichiers->dir_fichier($identifier, $filename); @@ -281,23 +282,41 @@ class Flow { * * @param string $filename * @param string $identifier - * @param int $chunkSize * @param int $totalSize + * @param int $totalChunks Nombre de chunks déclarés par flow * @return bool **/ - public function isFileUploadComplete($filename, $identifier, $chunkSize, $totalSize) { - if ($chunkSize <= 0) { - return false; - } - $numOfChunks = intval($totalSize / $chunkSize) + ($totalSize % $chunkSize == 0 ? 0 : 1); - for ($i = 1; $i <= $numOfChunks; $i++) { + public function isFileUploadComplete($filename, $identifier, $totalSize, $totalChunks) { + for ($i = 1; $i <= $totalChunks; $i++) { if (!$this->isChunkUploaded($identifier, $filename, $i)) { return false; } } + $chunkTotalSize = $this->getChunkTotalSize($filename, $identifier); + if ($totalSize < $chunkTotalSize) { + $this->error("Taille incorrecte des morceaux pour $identifier : $totalSize attendu, $chunkTotalSize present"); + return false; + } return true; } + /** + * Retourne la taille de l’ensemble des morceaux récupérés pour ce fichier + * + * @param string $identifier + * @param string $filename + * @return int Taille en octets, total des différentes parties + */ + public function getChunkTotalSize($filename, $identifier) { + $chunksDir = $this->cache->parts->fichiers->dir_fichier($identifier, $filename); + $chunks = $this->getChunkFiles($chunksDir); + $size = 0; + foreach ($chunks as $chunk) { + $size += filesize($chunk); + } + return $size; + } + /** * Retrouve les morceaux d'un fichier, dans l'ordre ! *