Valider 3747a71c rédigé par marcimat's avatar marcimat
Parcourir les fichiers

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.
parent 509ef131
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+31 −12
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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 !
	 *