[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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 02.07.2011, 23:07:10

Mhm .. aber ich werd kaum im SERVER Array erkennen welches dateisystem der user nutzt ;)

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 08.07.2011, 09:33:35

Korrekt, aber du könntest zumindest WIN und LINUX unterscheiden. Nehmen wir pauschal an, dass Windows immer NTFS einsetzt, wäre das wiederum eine Hilfe.
Viele Grüße,
Christian

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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 08.07.2011, 09:57:29

Also wenn ich das richtig verstehe ist der Wunsch eine allgemeine, mitdenkende, Methode zu schreiben die dann doch wiederum auf Annahmen basiert auf Grund derer das Ergebnis falsch sein kann ;)

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 09.07.2011, 15:38:03

Besser als immer fehlerhaft, oder? ;)
Viele Grüße,
Christian

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

Re: FilesystemManager erweitern - filesize

Beitrag von Well » 09.07.2011, 17:46:04

Hm, wenn ich eine CD reinschiebe zeigt mir Windows auch nur 690MB statt 700MB an. Ich denke daher, dass das vom Dateisystem unabhängig ist (... zudem wird mir auch unter Linux die korrekte Größe von einer NTFS / FAT32 Partition geliefert).

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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 28.07.2011, 02:31:35

hab schnell mal eine erkennung eingebaut ob es sich um ein windows system handelt und falls ja wird dann die entsprechende Berechnung vorgenommen.

Code: Alles auswählen

/**
     * Diese Funktion formatiert eine als $size übermittelte Byte Zahl.
     * Optional kann die der Wert der Kommastellen auf die gerundet  bzw. eine 
     * Einheit in die umgeformt werden soll angegeben werden.
     * 
     * Wenn die Ausgabeinheit nicht definiert ist, wird der $decimal Parameter 
     * verwendet um zu klären welches Format gewünscht ist. Sollte dieser auch 
     * nicht definiert, wird ermittelt ob es sich um ein Windows System handelt.
     * Falls ja wird die Größe binär berechnet.
     * 
     * @author Werner Liemberger <wpublicmail [at] gmail.com>
     * 
     * @version 1.1, 28.7.2011
     * Betriebsystemerkennung implementiert
     * @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=null) {
        $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');

        $divisor = 1000;

        if ($decimal === null) {
            $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);

            if (preg_match('/windows|win32/', $userAgent)) {
                $decimal = false;
            } else {
                $decimal = true;
            }
        }

        if ($unit == null) {
            if ($decimal != true) {
                $divisor = 1024;
            }
        } else {
            if (in_array($unit, $units)) {
                $divisor = 1024;
            }
        }

        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;
        }
    }
 

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 04.08.2011, 09:26:31

Hi Werner,

das wird so nicht funktionieren, da du das OS des Clients abfragst, nicht des Servers. :) Zur Abfrage kannst du entweder $_SERVER['SERVER_SOFTWARE'] oder $_ENV['OS'] nutzen.
Viele Grüße,
Christian

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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 05.08.2011, 14:07:10

das ich das betriebssystem des clients abfrage bin ich mir sehrwohl bewusst, da es ja auch der client ist der die seite benutzt ;) und somit die richtige Größe der Datei (die er zb speichern will) erhält.

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 05.08.2011, 18:31:15

Das verstehe ich nicht. Sicher möchte de Client eine Datei speichern, jedoch liegt die Datei doch auf dem Server und die Größe muss dort berechnet werden. Oder liege ich da falsch? :?
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: FilesystemManager erweitern - filesize

Beitrag von Screeze » 05.08.2011, 18:52:39

Ich glaube er möchte das Problem umgehen, dass der Client eine Datei nicht hochladen kann, weil maximal 4 MB erlaubt sind (4000kb) er aber 4002 kb hochladen will, weil windows die datei als < 4 Mb anzeigt.

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 05.08.2011, 18:59:27

OK, das ist verständlich. Warten wir nochmal auf Werner.
Viele Grüße,
Christian

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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 05.08.2011, 19:26:26

das ganze ist folgendermaßen.

soweit ich weiß erhält man die Größe einer datei immer in byte. Meine überlegung hinter der erweiterung war, dass ich diese unpraktische einheit gerne in etwas handlicheres umrechnen will.

für download tables finde ich es persönlich praktischer, wenn ich gleich sehen kann wie groß die dateien auf meinem system sind. Ebenso will ich nicht vom server gepflanzt werden wenn ich eine datei kleiner 4 mb (laut meinem system) rauf lad und mir der server mitteilt, dass die datei größer als 4 mb ist.

wie aber schon die diskussion preisgibt, wird vermutlich beides gebraucht. einmal serverseitig und einmal clientseitig (für die verschiendenen anwendungsfälle)

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 06.08.2011, 23:14:13

OK, dann schlage ich eine Methode vor, die entweder beides kann (ist vielleicht ein bischen zu viel "uncle bob") oder zwei Methoden, die jeweils eine andere "Formatierung" zurückgeben. Kannst du das noch einbauen, dann integriere ich das noch für 1.14.
Viele Grüße,
Christian

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

Re: FilesystemManager erweitern - filesize

Beitrag von welworx » 08.08.2011, 08:39:42

hi,

ok ist integriert.

Code: Alles auswählen

/**
     * Diese Funktion formatiert eine als $size übermittelte Byte Zahl.
     * Optional kann die der Wert der Kommastellen auf die gerundet  bzw. eine 
     * Einheit in die umgeformt werden soll angegeben werden.
     * 
     * Wenn die Ausgabeinheit nicht definiert ist, wird der $decimal Parameter 
     * verwendet um zu klären welches Format gewünscht ist. Sollte dieser auch 
     * nicht definiert, wird ermittelt ob es sich um ein Windows System handelt.
     * Falls ja wird die Größe binär berechnet.
     * 
     * @author Werner Liemberger <wpublicmail [at] gmail DOT com>
     * 
     * @version 1.0, 8.8.2011
     * 
     * @param byte $size Bytewert der Formatiert werden soll
     * @param int $round Anzahl der Kommastellen auf die gerundet werden soll
     * @param $server Wenn überprüft werden soll ob das System sich um ein Windows System handelt, wird mit true der Server untersucht und mit false der Client.
     * @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, $server=false, $unit=null, $decimal=null) {

        $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');

        $divisor = 1000;

        if ($decimal === null) {
            if ($server == false) {
                $userAgent = strtolower($_SERVER['SERVER_SOFTWARE']);
            } else {
                $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
            }
            if (preg_match('/windows|win32/', $userAgent)) {
                $decimal = false;
            } else {
                $decimal = true;
            }
        }

        if ($unit == null) {
            if ($decimal != true) {
                $divisor = 1024;
                $decimal = false;
            }
        } else {
            if (in_array($unit, $units)) {
                $divisor = 1024;
                $decimal = false;
            }
        }

        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;
        }
    } 

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

Re: FilesystemManager erweitern - filesize

Beitrag von dr.e. » 08.08.2011, 09:09:41

Noch eine Frage: warum wird relativ weit unten

Code: Alles auswählen

$decimal = false; 
gesetzt? Meine IDE sagt mir, dass diese Zuweisung entfallen kann.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast