Page 1 sur 1

Convertir Ko en Mo en php

Posté : 26 févr. 2014, 05:52
par nico44530
Bonjour,

J'utilise 2 fonctions pour calculer l'espace disque d'un répertoire sur le serveur.
J'affiche le pourcentage d'espace utilisé avec un plugin : "Circliful" de jQuery (http://ladensia.com/circliful/).

Le problème c'est que la fonction qui calcule l'espace disque utilise le Ko au lieu du Mo.
Par exemple, dans mon répertoire j'ai une image qui fait 247 Ko, le Circliful affiche l'espace disque complet puisque 247 sur 100% c'est plus que atteint.

J'aimerais que si l'espace disque utilise par exemple 530 Ko, que le Circliful affiche 0 Mo en attendant que 1 Mo soit atteint.

Voici mes 2 fonctions et mon php :
function size_readable($size, $max = null, $system = 'si', $retstring = '%01.00f%s'){

    $systems['si']['prefix'] = array('B', 'Ko', 'Mo', 'Go', 'To', 'Po');
    $systems['si']['size']   = 1000;
    $systems['bi']['prefix'] = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
    $systems['bi']['size']   = 1024;
    $sys = isset($systems[$system]) ? $systems[$system] : $systems['si'];
    $depth = count($sys['prefix']) - 1;
    if ($max && false !== $d = array_search($max, $sys['prefix'])){
        $depth = $d;
    }
    $i = 0;
    while ($size >= $sys['size'] && $i < $depth){
        $size /= $sys['size'];
        $i++;
    }
    return sprintf($retstring, $size, $sys[$i]);
}
function dirsize($path){

    $size = 0;
    if (substr($path, -1, 1) !== DIRECTORY_SEPARATOR){
        $path .= DIRECTORY_SEPARATOR;
    }
    if (is_file($path)) {
        return filesize($path);
    } elseif (!is_dir($path)){
        return false;
    }
    $queue = array($path);
    for ($i = 0, $j = count($queue); $i < $j; ++$i){
        $parent = $i;
        if (is_dir($queue[$i]) && $dir = @dir($queue[$i])){
            $subdirs = array();
            while (false !== ($entry = $dir->read())){
                if ($entry == '.' || $entry == '..'){
                    continue;
                }
  
                $path = $queue[$i] . $entry;
                if (is_dir($path)){
                    $path .= DIRECTORY_SEPARATOR;
                    $subdirs[] = $path;
                } elseif (is_file($path)){
                    $size += filesize($path);
                }
            }
            unset($queue[0]);
            $queue = array_merge($subdirs, $queue);
  
            $i = -1;
            $j = count($queue);
  
            $dir->close();
            unset($dir);
        }
    }
    return $size;
}
<?php 
$dossier = 'upload/'.$data['folder'];
$dossierSize = size_readable(dirsize($dossier));
if($dossierSize < 100){
	echo '<div class="circleProgress tooltip_top" title="Espace utilisée de vos photos sur le serveur / 1 Go" data-dimension="100" data-text="'.$dossierSize.'" data-fontsize="15" data-width="10" data-border="inline" data-percent="'.$dossierSize.'" data-fgcolor="#0b7baa" data-bgcolor="#d7d8d9" data-fill="#fff"></div>';
} elseif($dossierSize >= 101){
	echo '<div class="circleProgress circleRed tooltip_top" title="Espace utilisée de vos photos sur le serveur / 1 Go" data-dimension="100" data-text="1 Go" data-fontsize="15" data-width="10" data-border="inline" data-percent="100" data-fgcolor="#e54a4a" data-bgcolor="#d7d8d9" data-fill="#fff"></div>';
} elseif($dossierSize <= 0.99){
	echo '<div class="circleProgress tooltip_top" title="Espace utilisée de vos photos sur le serveur / 1 Go" data-dimension="100" data-text="0 '.$prefix.'" data-fontsize="15" data-width="10" data-border="inline" data-percent="0" data-fgcolor="#0b7baa" data-bgcolor="#d7d8d9" data-fill="#fff"></div>';
}
?> 
MERCI DE VOTRE AIDE.

Re: Convertir Ko en Mo en php

Posté : 26 févr. 2014, 14:38
par xTG
A la louche il faut forcer la boucle pour aller jusqu'au Mo (à savoir le second index) :
while (($size >= $sys['size'] || $i < 2) && $i < $depth){
        $size /= $sys['size'];
        $i++;
    }

Re: Convertir Ko en Mo en php

Posté : 26 févr. 2014, 15:26
par nico44530
Merci beaucoup ;)
Ça fonctionne !

Je comprend pas trop les conditions de ta boucle ^^
Je sais utiliser les opérateurs de comparaison mais avec toutes ces lettres #-o
while (($size >= $sys['size'] || $i < 2) && $i < $depth){
        $size /= $sys['size'];
        $i++;
}
A quoi servent les variables $i, $depth, $sys ?

Merci encore pour ton aide ;)

Re: [RESOLU] Convertir Ko en Mo en php

Posté : 26 févr. 2014, 17:17
par xTG
Bon dernier essai de réponse...
Le proxy m'a jeté toutes les autres. :tir2:

$sys est le tableau contenant les ordres de grandeur et la taille pour passer de l'une à l'autre.
$depth est la taille du tableau $sys pour ne pas dépasser la dernière grandeur
$i est l'index de la grandeur courante.

On divise la taille par la mesure (1024 ou 1000) tant que l'on n'atteins pas la fin des ordres de grandeur et que le résultat est supérieur à 1 (ce dernier point est matérialisé par : $size >= $sys['size'] si ce que l'on veut diviser est plus grand que le dividende).
J'ai donc rajouté comme condition que l'on se doit d'arriver au moins au second ordre de grandeur (mega) avant de sortir de la boucle.