Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > $_FILES brauchbar umschreiben
Antwort
 
Themen-Optionen
Alt 13.12.2006, 11:28   Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard $_FILES brauchbar umschreiben

Hi.

Hat jemand einen Code-Schnipsel, um ein File-Upload-Array umzuschreiben?

Code:
$_FILES['foo']['size']['bar']['baz']

=>

$aUploads['foo']['bar']['baz']['size']
bzw.
$aUploads['foo']['bar']['baz']->size;
$aUploads['foo']['bar']['baz']->getSize();
Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.12.2006, 18:31   Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 503
Standard

ähm erhlich gesagt hab ich keinen plan, was du uns sagen willst...
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.12.2006, 20:17   Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Noch nie ein Input-Feld vom Typ file mit einem Array als Namen verarbeitet oder was ist unklar?

Code:
<input type="file" name="foo[bar][baz]" />
Hier kommt doch ein Array bei raus, auf dass man wie oben geschrieben zugreifen muss, um die Dateigröße zu bekommen, anstatt eben das Array mit den Datei-Eigenschaften in $_FILES['foo']['bar']['baz'] legen zu haben. Ich möchte bestimmten Komponenten nur "ihren Part" des Requests zugänglich machen (z.B. $Request = new RequestFilter($Request, 'foo.bar')), daher brauch ich eben das Format, das man eigentlich erwarten würde.

Ist letztlich auch nicht so wichtig. Ich komm nur auf keine elegante Lösung. Alles irgendwie ein ziemlich ätzendes "rumgerechne"...

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.12.2006, 20:52   Nach oben    #4
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Ich glaube ich habe alles verstanden:

Du willst eine Zugriffskontrolle für das $_FILE-Array

bis auf

Zitat:
daher brauch ich eben das Format, das man eigentlich erwarten würde.
Was meinst du damit?

MfG Byrel
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.12.2006, 21:00   Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Na, wenn ich ein Formularfeld foo[bar][baz] nene, dann erwarte ich Dateigröße, -typ, -name etc. in $_FILES['foo']['bar']['baz']['size'] etc. und nicht in $_FILES['foo']['size']['bar']['baz'].

$_FILES['size']['foo']... würde ich ja auch noch verstehen, aber das gegebene Format lässt sich einfach nur beschissen handeln.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.12.2006, 14:33   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Hi.

Hat jemand einen Code-Schnipsel, um ein File-Upload-Array umzuschreiben?

Code:
$_FILES['foo']['size']['bar']['baz']

=>

$aUploads['foo']['bar']['baz']['size']
bzw.
$aUploads['foo']['bar']['baz']->size;
$aUploads['foo']['bar']['baz']->getSize();
Basti
PEAR ist immer eine gute anlaufstelle:
HTTP_Upload
http://pear.php.net/manual/en/packag...mples.multiple
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 19:23   Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Habs nicht ausprobiert, aber das kann nicht funktionieren.

Aus dem PEAR-Paket:
PHP-Code:
        // Parse $_FILES (or $HTTP_POST_FILES)
        
$files = array();
        foreach (
$this->post_files as $userfile => $value) {
            if (
is_array($value['name'])) {
                foreach (
$value['name'] as $key => $val) {
                    
$err $value['error'][$key];
                    if (isset(
$err) && $err !== && isset($uploadError[$err])) {
                        
$error $uploadError[$err];
                    } else {
                        
$error null;
                    }
                    
$name basename($value['name'][$key]);
                    
$tmp_name $value['tmp_name'][$key];
                    
$size $value['size'][$key];
                    
$type $value['type'][$key];
                    
$formname $userfile "[$key]";
                    
$files[$formname] = new HTTP_Upload_File($name$tmp_name,
                                                             
$formname$type$size$error$this->lang$this->_chmod);
                }
                
// One file
            
} else {
                
$err $value['error'];
                if (isset(
$err) && $err !== && isset($uploadError[$err])) {
                    
$error $uploadError[$err];
                } else {
                    
$error null;
                }
                
$name basename($value['name']);
                
$tmp_name $value['tmp_name'];
                
$size $value['size'];
                
$type $value['type'];
                
$formname $userfile;
                
$files[$formname] = new HTTP_Upload_File($name$tmp_name,
                                                         
$formname$type$size$error$this->lang$this->_chmod);
            }
        } 
Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 22:05   Nach oben    #8
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

...so haut es hin:

PHP-Code:
<?php

error_reporting
(E_ALL);

$_FILES = array(

    
'foo' => array(

        
'size' => array(
            
'bar' => 10,
            
'baz' => 1024,
            
'puh' => array('blum' => 12)
        ),

        
'name' => array(
            
'bar' => 'bar.txt',
            
'baz' => 'baz.php',
            
'puh' => array('blum' => 'plum.jpg')
        )
    ),

    
'simple' => array(
    
        
'size' => 100,
        
'name' => 'simple.csv'
    
)
);

$R = new HttpRequest;
var_dump($R);

class 
HttpRequest
{
    protected 
$aUploads;

    public function 
__construct()
    {
        
$this->retrieveUploads();
    }

    protected function 
retrieveUploads()
    {
        
$this->aUploads = array();
        
$aTmp = array();

        foreach (
$_FILES as $sKey => $mValue)
            foreach (
$mValue as $sProperty => $sValue)
                
$aTmp[$sProperty][$sKey] = $sValue;

        if (!empty(
$aTmp))
            
$this->aUploads $this->getThem($aTmp['size']);
    }

    protected function 
getThem($aPart$sIdentifier null)
    {
        foreach (
$aPart as $sKey => $mValue) {

            
$sNewKey = (!is_null($sIdentifier))
                ? 
$sIdentifier '.' $sKey
                
$sKey;

            if (
is_array($aPart[$sKey])) {

                
$aResult[$sKey] = $this->getThem($aPart[$sKey], $sNewKey);

            } else {

                
$aResult[$sKey] = $this->buildUploadFile($sNewKey);
            }
        }
        return 
$aResult;
    }

    protected function 
buildUploadFile($sIdentifier)
    {
        
$Upload = new Upload;
        
$Upload->size $this->getUploadProperty($sIdentifier'size');

        return 
$Upload;
    }

    protected function 
getUploadProperty($sIdentifier$sProperty)
    {
        
$aParts explode('.'$sIdentifier);
        
$sFirst array_shift($aParts);
        
array_unshift($aParts$sFirst$sProperty);

        return 
$this->getByIdentifier(implode('.'$aParts), $_FILES);
    }

    protected function 
getByIdentifier($sIdentifier$a)
    {
        
$aParts explode('.'$sIdentifier);
        
$sFirst array_shift($aParts);

        if (!isset(
$a[$sFirst]))
            return 
null;

        if (
=== count($aParts))
            return 
$a[$sFirst];

        return 
$this->getByIdentifier(implode('.'$aParts), $a[$sFirst]);
    }
}

class 
Upload
{
}
Super Bezeichner, was? *g

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 17:20   Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Hab mir gerad das PEAR-Paket nochmal angeschaut und es kann tatsächlich keine Werte entgegennehmen, deren Input-Name ein mehr als zweidimensionales Array darstellen.

Dazu kommt, das magic_quotes.gpc bei den Dateinamen nich berücksichtigt wird.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 17:37   Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Warum so kompliziert?! Bau dir doch einfach eine rekursive Funktion, die das für dich übernimmt, wo ist das Problem?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 18:03   Nach oben    #11
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Hab ich doch (oben heißt sie noch getThem()). Aber setz dich mal selbst dran. Wenn ich mich nicht völlig bescheuert angestellt hab (was durchaus sein kann), dann ist das ne ziemlich harte Nuss. Zumindest, was Implementierung angeht, die Aufgabe, an der ich seit langem am längsten gesessen bin (im Verhältnis zu ihrer Unscheinbarkeit). Sonst halten mich eigentlich nur komplexe Entwurfs-Aufgaben auf oder eben Bereiche, die nicht direkt PHP betreffen (SQL, XSLT, JavaScript, ...).

Drum hab ich hier auch nachgefragt und ich bin immernoch interessiert an einer simpleren, eleganteren Lösung.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 18:35   Nach oben    #12
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Werde mir vielleicht die nächsten Tage mal den Kopf darüber zerbrechen, aber ansich kann das so schwer garnicht sein!? Ich schaue mal, was sich machen lässt, momentan habe ich den Kopf voll von anderen Dingen...
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 18:41   Nach oben    #13
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Das Problem ist ja eigentlich nur, ein Arrayelement anhand von der "Folge der Schlüssel" anzusprechen (z.B. "foo.size.bar.baz"). Beziehungsweise, so ist es kein Problem und die Funktion hatte eh schon in der Klasse implementiert, da ich alle Request-Parameter genau so anspreche. Ich dachte halt, ich komm da rgendwie drum rum und kann das Array einfach irgendwie umkopieren. Ist mir aber nicht gelungen.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 09:45   Nach oben    #14
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Man muss dazu allerdings sagen, dass es eigentlich egal sein müsste, ob das jetzt vor oder hinter dem entsprechenden Element steht!? Zumindest sollte es kein Problem darstellen, zu sagen "Erstes Element ist der Name ansich und der Rest kommt nach der Zuweisung, welche Information ich auslesen will", verstehst du, wie ich das meine?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 13:11   Nach oben    #15
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
Man muss dazu allerdings sagen, dass es eigentlich egal sein müsste, ob das jetzt vor oder hinter dem entsprechenden Element steht!? Zumindest sollte es kein Problem darstellen, zu sagen "Erstes Element ist der Name ansich und der Rest kommt nach der Zuweisung, welche Information ich auslesen will", verstehst du, wie ich das meine?
Nein, sorry. Habs nicht verstanden.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 19:47   Nach oben    #16
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

naja, wenn du eine Klasse schreibst, der du sagst "Greife auf bla.blubb.bla.blubb zu", kannst du doch von der Klasse automatisch sagen lassen, den ersten Part "bla" als Array nutzen ($_FILES['bla']), dann den Part auf den man zugreifen will und dann den Rest -> $_FILES['bla']['size']['blubb']['bla']['blubb']!?

Ich verstehe nicht so ganz, warum man da jetzt so rumexperimentieren muss!?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 21:23   Nach oben    #17
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

So ist's doch auch umgesetzt. Ich dachte halt wie geschrieben, es gäbe einen direkteren Weg, ein Array umzuschreiben, anstatt auf jedes Element zuzugreifen, schauen, obs ein Array enthält etc. bis man bei einem Wert angelangt ist, sich den "Pfad" dahin zu merken, für jedes Attribut diesen einmal umzuschreinen, damit auf $_FILES zuzugreifen und aus den so geammelten Werten dann eben ein Objekt zu bauen.

Hätte mich halt gefreut zu hören, wie z.B. bestimmte PHP-nativen Funktionen für derartiges Zeug benutzt werden könnten. Und so hab ich halt selbst auch ertmal rumgesucht und probiert, obs nicht anders geht - auch, wenn die Methode, über den Pfad auf ein Array zuzugreifen ja schon von Anfang an da war.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen