[php] multiple file upload

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hi mensen,

ik ben bezig met een file upload en ik wil zo graag het wiel opnieuw uitvinden voor mezelf.
Copypasten leer ik geen donder van merk ik.

Met 1 upload gaat het prima:

HTML:
1
<input name=\"uploadFile\" type=\"file\" size=\"32\" />


en bij de afhandeling
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if ( isset ( $_FILES['uploadFile'] ) ) {
    $upload = new fileupload('uploadFile');
}

// stukje van de class

function fileupload($sFile)
{
        $this->sFile = $sFile;
        $this->sFileName = strtolower($_FILES[$sFile]['name']); 
        $this->sTmpName  = $_FILES[$sFile]['tmp_name'];          

}


Dat werkt dus allemaal prima.
Maar hoe doe ik dit met meerdere uploads?

Ik heb meerdere uploads met een ID die ik later nodig heb.

HTML:
1
2
3
<input name=\"uploadFile[3]\" type=\"file\" size=\"32\" />
<input name=\"uploadFile[7]\" type=\"file\" size=\"32\" />
<input name=\"uploadFile[11]\" type=\"file\" size=\"32\" />


en deze wil ik dus oploaden wat ik niet voor elkaar krijg.
Ik moet vast met een foreach werken maar dat hoe dat werkt met een $_FILES krijg ik niet gevonden.

PHP:
1
2
3
4
// Dit werkt dus niet!!
foreach($_FILES['uploadFile'] as $key => $value) {
     $upload = new fileupload('uploadFile');
}


Ik hoop dat jullie me op weg kunnen helpen

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
PHP:
1
2
3
4
5
<?php 
foreach($_FILES as $key => $value) { 
     $upload = new fileupload('uploadFile'); 
} 
?>


niet getest :P of probeer is een print_r($_FILES); weet je iig wat erin zit en wat je mee moet geven aan fileupload.

[ Voor 9% gewijzigd door rewind. op 29-08-2007 23:53 ]


Verwijderd

Topicstarter
Helaas dat werkt niet,

bovendien heb ik naast de
HTML:
1
2
3
<input name=\"uploadFile[3]\" type=\"file\" size=\"32\" />
<input name=\"uploadFile[7]\" type=\"file\" size=\"32\" />
<input name=\"uploadFile[11]\" type=\"file\" size=\"32\" />


ook nog 2 andere uploads
HTML:
1
2
<input name=\"uploadImage\" type=\"file\" size=\"32\" />
<input name=\"uploadPdf\" type=\"file\" size=\"32\" />


dat krijg ik niet voor elkaar zo toch?

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Niet ipv:
PHP:
1
new fileupload('uploadFile');

zo
PHP:
1
new fileupload($value);

En dan een beetje debuggen om te kijken wat er in de value zit om de rest van je code goed te zetten. Maar dat kan je vast wel.

disjfa - disj·fa (meneer)
disjfa.nl


Verwijderd

Topicstarter
thanks voor de tips,

ik kom er echter toch nog niet helemaal uit.
Ik heb ondertussen mijn class aangepast, die was niet helemaal ok.

mijn upload werkt nu als volgt voor een enkelvoudig upload:

PHP:
1
$upload = new fileupload($_FILES['uploadFile']);


Echter met een meervoudige fileupload via
HTML:
1
2
<input name=\"uploadFile[3]\" type=\"file\" size=\"32\" />
<input name=\"uploadFile[4]\" type=\"file\" size=\"32\" />


krijg ik het niet voor elkaar.
Als ik nl. onderstaande gebruik gaat het niet werken.

PHP:
1
2
3
    foreach ($_FILES['uploadFile'] as $key => $val) {
        $upload = new fileupload($val);
    }


Waarom? Volgens mij omdat ik dan nog niet 1 uploadFile eruit pik.
$_FILES['uploadFile'] bestaat uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Array
(
    [name] => Array
        (
            [0] => foo.txt
            [1] => bar.txt
        )

    [type] => Array
        (
            [0] => text/plain
            [1] => text/plain
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpYzdqkD
            [1] => /tmp/phpeEwEWG
        )

    [error] => Array
        (
            [0] => 0
            [1] => 0
        )

    [size] => Array
        (
            [0] => 123
            [1] => 456
        )
)


Hier staat een oplossing: http://nl3.php.net/manual...upload.multiple.php#53240
Als ik die gebruik dan werkt het:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}


    $file_ary = reArrayFiles($_FILES['uploadFile']);

    foreach ($file_ary as $file) {
        $upload = new fileupload($file);
    }



maar.... ik heb per uploadFile ook het id nodig dat ik meestuur: (uploadFile[3])
En die zie ik dus nergens terug..
Iemand een idee? Ik heb nl. het idee dat dit omslachtig is!

thanks

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

HTML:
1
2
3
4
5
6
Noem je inputs:
<input name=\"uploadFile[]\" type=\"file\" size=\"32\" /> 
<input name=\"uploadFile[]\" type=\"file\" size=\"32\" /> 
<input name=\"uploadFile[]\" type=\"file\" size=\"32\" /> 
<input name=\"uploadFile[]\" type=\"file\" size=\"32\" /> 
<input name=\"uploadFile[]\" type=\"file\" size=\"32\" />

PHP zal dit automagisch snappen, ze komen automagisch in een arraytje te staan :D

Daarna werkt dit (aangezien die files allemaal als een array binnenkomen:
PHP:
1
2
3
4
foreach($_FILES['uploadFile'] as $file)
{
$upload = new fileupload($file);
}

suc6 :)
on that same topic, kijjk even naar Mootools + FancyUpload voor briljante resultaten

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Schizo,

ziet er gelikt uit! sweet..

Maar waar maak ik dan nu de denkfout?
Hieronder toch zo'n beetje het meest basic voorbeeld dat ik kan maken toch?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {

    // GEEFT WEL RESULTAAT
    print_r($_FILES['uploadFile']);

        // GEEFT GEEN RESULTAAT
    foreach($_FILES['uploadFile'] as $file)
    {
        echo 'name ='.$file['name'];  
        echo 'tmp='.$file['tmp_name'];      
    } 
}


HTML:
1
2
3
4
5
6
7
<form enctype="multipart/form-data" method="post" name="form1" action="index.php">
<input name="uploadFile[]" type="file" size="32" /><br /> 
<input name="uploadFile[]" type="file" size="32" /> <br /> 
<input type="hidden" name="MM_update" value="form1">
<input type="submit" value="Update record">
</form>
<p>&nbsp;</p>


Ik word er een beetje debiel van geloof ik 8)7
Heb toch echt wel vaker een uploadje gemaakt maar ik loop maar te klooien geloof ik.

[ Voor 8% gewijzigd door Verwijderd op 31-08-2007 00:43 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

arg, ja dat is waar ook... dat steekt wat wazig in elkaar bij PHP; er zit een verschil in logica tussen hoe je $_POST input arrays binnen komen en je $_FILES input arrays

Als je die array bekijkt zul je zien dat $_FILES['uploadFile']['name'] een array is, type, tmp_name, error, ook, etc.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Array
(
    [name] => Array
        (
            [0] => bananaphone05.mp3
            [1] => 4160eng.exe
        )

    [type] => Array
        (
            [0] => audio/mpeg
            [1] => application/x-msdos-program
        )

    [tmp_name] => Array
        (
            [0] => c:/wamp/tmp\php254.tmp
            [1] => c:/wamp/tmp\php255.tmp
        )

    [error] => Array
        (
            [0] => 0
            [1] => 0
        )

    [size] => Array
        (
            [0] => 145555
            [1] => 2980421
        )

)


Wat jij dus eigenlijk wil is dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(sizeof($_FILES['uploadFile'])> 0)
{
    for($i=0; $i<sizeof($_FILES['uploadFile']['name']); $i++) // we nemen dus de grootte uit de $_FILES['uploadFile']['name'] array!!
    {
        var $currentFile = array();     // en die dumpen wwe voor het overzicht netjes in elk een aparte array
        $currentFile['name'] = $_FILES['uploadFiles']['name'][$i];
        $currentFile['type'] = $_FILES['uploadFiles']['type'][$i];
        $currentFile['tmp_name'] = $_FILES['uploadFiles']['tmp_name'][$i];
        $currentFile['error'] = $_FILES['uploadFiles']['error'][$i];
        $currentFile['size'] = $_FILES['uploadFiles']['size'][$i];
        $upload = new FileUpload($currentFile); // die gooi je dan weer naar je fileupload class :)
    }

}

Ik kan mezelf ineens spontaan weer herinneren dat ik hier zelf ook wel mee heb zitten te prutsen :X

[ Voor 41% gewijzigd door SchizoDuckie op 31-08-2007 09:19 . Reden: Thx janoz :* het was nog vroeg 8)7 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

@ beide eendjes hierboven ;) :

Je bent de labels vergeten achter $currentFile.

Vreemd trouwens dat php op zo'n vreemde plek de index toevoegt. Je zou, zoals TS ook heeft gedaan, verwachten dat die index tussen uploadFiles en de verschillende delen zou komen ipv achteraan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Janoz schreef op vrijdag 31 augustus 2007 @ 09:03:
@ beide eendjes hierboven ;) :

Je bent de labels vergeten achter $currentFile.

Vreemd trouwens dat php op zo'n vreemde plek de index toevoegt. Je zou, zoals TS ook heeft gedaan, verwachten dat die index tussen uploadFiles en de verschillende delen zou komen ipv achteraan.
labels vergeten :? enlighten me?
Ik zie 'm 8)7

Ja die vreemde plek voor de index is nou juist het probleem van ts :P Dat werkt al zo sinds ik met php werk volgens mij, maar then again, er zitten wel meer vaagheden in PHP

Stop uploading passwords to Github!

Pagina: 1