Browse Source

Ticket #4851 : Pour vérifier côté PHP que le nombre de morceaux de fichiers reçu est corrects,

on utilise le nombre de chunks envoyé par flow.js plutôt que de tenter de le calculer soi-même.

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.
pull/4852/head
Matthieu Marcillaud 1 month ago
parent
commit
3747a71c10
  1. 43
      inc/Bigup/Flow.php

43
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$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$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 !
*

Loading…
Cancel
Save