[erledigt] FilesystemManager erweitern - filesize

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

[erledigt] FilesystemManager erweitern - filesize

Beitrag von welworx » 30.06.2011, 00:44:11

Was haltet ihr davon folgende Funktion in den Filesystemmanager zu integrieren, damit man einfach die Dateigröße in einer brauchbaren Einheit ausgeben kann?

Code: Alles auswählen

    /**
     * Funktion die die übermittelte Größe in Byte auf eine komfortable Einheit 
     * umrechnet.
     * @param integer $size
     * @return string
     * @author Werner Liemberger <wpublicmail@gmail.com>
     * @version 1.0, 14.3.2011<br>
     */
    public static function format_bytes($size) {
        $units = array(' B', ' KB', ' MB', ' GB', ' TB');
        for ($i = 0; $size >= 1024 && $i < 4; $i++)
            $size /= 1024;
        return round($size, 2) . $units[$i];
    }
Zuletzt geändert von welworx am 26.08.2011, 00:26:28, insgesamt 1-mal geändert.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 30.06.2011, 19:37:18

Hallo Werner,

kannst du in der Methoden-Dokumentation noch die Bedeutung der einzelnen Parameter und Rückgabe-Werte beschreiben? Welche Einheit muss der Eingabe-Parameter haben (bytes, ...)? Habe ich eine Möglichkeit, die Ausgabe-Einheit zu bestimmen (vielleicht will ich KB in MB konvertieren). Warum wird "nur" auf zwei Stellen gerundet?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 30.06.2011, 19:52:00

ja kann ich noch hinzufügen.
Welche Einheit muss der Eingabe-Parameter haben (bytes, ...)
.. ja steht in der Funktionsbeschreibung ;)
Habe ich eine Möglichkeit, die Ausgabe-Einheit zu bestimmen
zur zeit nicht, aber kann ich gern nachrüsten
Warum wird "nur" auf zwei Stellen gerundet?
Weil mir das bis jetzt eigentlich immer gereicht hat ;)

kann man natürlich auch so machen, dass man das optional angeben kann.

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 30.06.2011, 21:01:00

gesagt getan ....

Code: Alles auswählen

/**
 * Diese Funktion formatiert eine als $size übermittelte Byte Zahl.
 * Optional kann die der Wert der Kommastellen auf die geundundet werden soll
 * angegeben bzw eine Einheit in die umgeformt werden soll.
 * 
 * @author Werner Liemberger <wpublicmail [at] gmail.com>
 * 
 * @version 1.0, 30.6.2011
 * 
 * @param byte $size Bytewert der Formatiert werden soll
 * @param int $round Anzahl der Kommastellen auf die gerundet werden soll
 * @param string $unit Einheit auf die umgeformt werden soll
 * @return string Liefert den formatierten Größenwert als String inklusive Einheit zurück. 
 */
public static function formatByte($size, $round=2, $unit=null) {

    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');
    if ($unit == null) {
        $i = 0;
        $j = count($units);
        while ($size >= 1024 && $i < $j) {
            $size/=1024;
            $i++;
        }
        return round($size, $round) . ' ' . $units[$i];
    } else {
        $key = array_keys($units, $unit, true);
        return round($size / pow(1024, $key[0]), $round) . ' ' . $unit;
    }
} 
passt das so? Wenn ja bitte einchecken.

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: FilesystemManager erweitern - filesize

Beitrag von Well » 01.07.2011, 00:19:35

Kilo, Mega, Giga, Tera, Peta und Exa sind Dezimalpräfixe. Ein Kilogramm hat auch keine 1024 Gramm. :)

Ansonsten würde ich die Liste mit den Einheiten noch fortsetzen. So große Dateien wird es zwar sicher nicht geben, aber vielleicht möchte ihn ja jemand für "theoretische Dateien" oder so verwenden? Keine Ahnung, schaden würde es aber sicher nicht.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: FilesystemManager erweitern - filesize

Beitrag von Megger » 01.07.2011, 00:24:25

KiB, MiB, GiB usw. sollten da abhilfe schaffen oder halt die Umstellung auf 1000 oder vielleicht beides
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 01.07.2011, 00:26:50

hab mir gedacht die tatsächliche größe wäre interessanter (daher die divisionen durch 1024)

Wie weit soll ich das fortsetzten? bis Yotta?

Edit: das mit MiB und co wäre natürlich eine variante. Jetzt is mir endlich klar was MiB heißen soll .. hab das unlängst mal wo gelesen und mich gewundert ;)

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: FilesystemManager erweitern - filesize

Beitrag von Well » 01.07.2011, 00:31:31

welworx hat geschrieben:hab mir gedacht die tatsächliche größe wäre interessanter (daher die divisionen durch 1024)

Wie weit soll ich das fortsetzten? bis Yotta?

Edit: das mit MiB und co wäre natürlich eine variante
Na ja, die "tatsächliche" Größe ist es nur unter Windows. Die meisten andere Betriebssysteme machen das richtig ... Wie wäre es, die Zahl (1000 / 1024) einstellbar zu machen?

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 01.07.2011, 00:44:13

Code: Alles auswählen

/**
 * Diese Funktion formatiert eine als $size übermittelte Byte Zahl.
 * Optional kann die der Wert der Kommastellen auf die geundundet werden soll
 * angegeben bzw eine Einheit in die umgeformt werden soll.
 * Wenn die Ausgabeinheit nicht definiert ist, wird der $decimal Parameter verwendet
 * um zu klären welches Format gewünscht ist.
 * 
 * @author Werner Liemberger <wpublicmail [at] gmail.com>
 * 
 * @version 1.0, 30.6.2011
 * 
 * @param byte $size Bytewert der Formatiert werden soll
 * @param int $round Anzahl der Kommastellen auf die gerundet werden soll
 * @param string $unit Einheit auf die umgeformt werden soll
 * @param bool $decimal Gibt die Einheit mit Dezimalpräfix zurück, ansonsten jene mit dem Binärpräfix
 * @return string Liefert den formatierten Größenwert als String inklusive Einheit zurück. 
 */
public static function formatByte($size, $round=2, $unit=null, $decimal=true) {

    $unitsBinary = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB');
    $unitsDezimal = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');

    $divisor = 1000;

    if ($unit == null) {
        if ($decimal != true) {
            $divisor = 1024;
            $decimal = false;
        }
    } else {
        if (in_array($unit, $unitsBinary)) {
            $divisor = 1024;
            $decimal = false;
        }
    }
    if ($decimal) {
        $units = $unitsDezimal;
    } else {
        $units = $unitsBinary;
    }
    if ($unit == null) {
        $i = 0;
        $j = count($units);
        while ($size >= $divisor && $i < $j) {
            $size/=$divisor;
            $i++;
        }
        return round($size, $round) . ' ' . $units[$i];
    } else {
        $key = array_keys($units, $unit, true);
        return round($size / pow($divisor, $key[0]), $round) . ' ' . $unit;
    }
} 
Done ;)

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: FilesystemManager erweitern - filesize

Beitrag von Well » 01.07.2011, 01:20:51

Hm ... Ich finde es noch immer nicht so optimal.

Gibt man eine Maximalgröße von 4 MiB an, weißt der DAU nicht was "MiB" sind; gibt man es mit 4 MB an, wundern sich die Nutzer wieso die 4 MiB große Datei (Windows: 4 MB) abgelehnt wird. Richtig man sich aber nach Windows missfolgt man die Norm, was ich persönlich (v.a. als Linux-Freund) auch nicht gerade schön finde.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 02.07.2011, 12:26:07

Hi zusammen,

optimal finde ich die Signatur ebenfalls nicht. Einerseits könnte man für die Berechnungen doch den NumberFormatter nutzen, andererseits müssten die Größen bezogen auf das System und das eingesetzte Filesystem berechnet werden...
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 02.07.2011, 17:14:23

gut das wäre natürlich auch eine variante.

NumberFormatter kannte ich bis jetzt noch nicht.
andererseits müssten die Größen bezogen auf das System und das eingesetzte Filesystem berechnet werden
mhm .. wäre sicher hilfreich ... nur wie kommt man auf das eingesetzte System? Geht das nicht nur mittels Javascript?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 02.07.2011, 19:54:12

Kannst du das nicht über das $_SERVER-Array auslesen?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 02.07.2011, 20:58:52

aja stimmt.. aber ist ein wenig im HTTP_USER_AGENT versteckt ;)

Da stellt sich mal ganz schnell die frage wie jetzt welches System mit den Dateigrößenberechnung wie umgeht. Ist nur Windows jenes dass das "falsch" macht?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 02.07.2011, 22:52:54

Ich würde nicht mal sagen, dass Windows das falsch macht, ich vermute einfach, dass es am Filesystem liegt.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast