Avatar billede palito Nybegynder
15. december 2006 - 17:57 Der er 11 kommentarer

Upload flere billeder på 1 gang

Hvordan kan jeg lave 5x<input type="file ..>, og så uploade de billeder hvor mit file-input er blevet rørt?

Så hvis jeg har valgt 3 billeder i de 5 mulige, så skal dne uploade de 5 osv.

Forståligt?:D
Avatar billede pidgeot Nybegynder
15. december 2006 - 18:08 #1
Du laver det på præcist samme måde som du ville lave det med et enkelt på siden - bare sørg for at hvert inputfelt har sit eget navn, eller at navnet slutter på [] så det bliver et array, så du ikke  ender med at overskrive noget.
Avatar billede palito Nybegynder
15. december 2006 - 18:11 #2
hvordan vil et kodeeksempel så se ud? (og der skulle selvfølgelig stå 3 og ikke 5 deroppe^^^^^^^^^^^^^:D)
Avatar billede pidgeot Nybegynder
15. december 2006 - 18:22 #3
Form:
<form method="post" enctype="multipart/form-data">
<input type="file" name="file1">
<input type="file" name="file2">
<input type="file" name="file3">
<input type="file" name="file4">
<input type="file" name="file5">
<!--submitknap og andre inputfelter skal naturligvis også indsættes, men det skulle du nok selv kunne klare-->
</form>

PHP:
<?PHP
if (isset($_FILES['file1']) && $_FILES['file1']['error']==UPLOAD_ERR_OK) {
/* gør hvad du nu engang skal gøre med filen */
}
if (isset($_FILES['file2']) && $_FILES['file2']['error']==UPLOAD_ERR_OK) {
/* gør hvad du nu engang skal gøre med filen */
}
if (isset($_FILES['file3']) && $_FILES['file3']['error']==UPLOAD_ERR_OK) {
/* gør hvad du nu engang skal gøre med filen */
}
if (isset($_FILES['file4']) && $_FILES['file4']['error']==UPLOAD_ERR_OK) {
/* gør hvad du nu engang skal gøre med filen */
}
if (isset($_FILES['file5']) && $_FILES['file5']['error']==UPLOAD_ERR_OK) {
/* gør hvad du nu engang skal gøre med filen */
}

Du kan naturligvis også køre en foreach på $_FILES, og så "nøjes" med at checke error i din if-sætning på hver af dem hvis det er det samme du skal lave på alle filerne - det fremgår dog ikke af spørgsmålet.
Avatar billede palito Nybegynder
15. december 2006 - 18:46 #4
Vil du prøve at lave det med foreach? Der skal gøres det samme ved hvert billede.
Avatar billede pidgeot Nybegynder
15. december 2006 - 18:55 #5
foreach ($_FILES as $file)
{
  if ($file['error']==UPLOAD_ERR_OK)
  {
    /* gør hvad du nu engang skal gøre med filen */
  }
}

Hvis navnet på fil-inputtet er relevant, kan du bruge foreach ($_FILES as $name => $file) - så har du navnet i $name inde i din foreach-løkke.
Avatar billede palito Nybegynder
15. december 2006 - 18:59 #6
Så dette burde udskrive navnene?

<form method="post">
    <input type="text" name="title" /><br />
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <textarea name="text"></textarea><br />
    <input type="submit" name="submit" /><br />
</form>
<?php
if( isset( $_POST['submit'] ) )
{
    foreach( $_FILES as $name => $file )
    {
        if( $file['error'] == UPLOAD_ERR_OK )
        {
            echo "{$name}<br />";
        }
    }
}
else
{
    echo "none";
}
?>

-
det gør det ikke
Avatar billede pidgeot Nybegynder
15. december 2006 - 19:02 #7
Nej - for når du beder om at få det i et array, er det ikke $_FILES du skal køre din foreach på, men arrayet du har valgt - $_FILES['file'].
Avatar billede palito Nybegynder
15. december 2006 - 19:04 #8
Warning: Invalid argument supplied for foreach()
Avatar billede pidgeot Nybegynder
15. december 2006 - 19:15 #9
Undskyld - kan nu se at det fungerer på en anden måde end andre former for array-submitting. Havde jeg ikke forventet, virker meget ulogisk for mig >_>

Jf. http://www.php.net/manual/en/features.file-upload.multiple.php vil de variable der ville være hvis du bare havde et enkelt input ved navn 'file' være arrays i sig selv. Dvs. det kommer til at se sådan ud:

foreach(array_keys($_FILES['file']['name']) as $index)
{
        if( $_FILES['file']['error'][$index] == UPLOAD_ERR_OK )
        {
            echo "{$_FILES['file']['name'][$index]}<br />";
        }
}

Du kan også skyde en lille genvej ved at lave foreachen på eks. navnet - gør da i det mindste koden lidt kortere, men måske også mindre uoverskueligt, når nu det kun er den ene ting der er hevet ud, og resten stadig skal hentes fra $_FILES:

foreach($_FILES['file']['name'] as $index => $name)
{
        if( $_FILES['file']['error'][$index] == UPLOAD_ERR_OK )
        {
            echo $name.'<br />';
        }
}

Fordi det er en rimelig træls struktur den sætter op, vil jeg nok anbefale du holder dig til at hvert input har sit eget navn - det er nemmere at overskue på den måde, og det er en simpel sag at sætte et nummer bag på inputnavnet hvis du alligevel benytter dig af en for-løkke.
Avatar billede palito Nybegynder
15. december 2006 - 19:24 #10
Følgende kode virker heller ikek:S

<form method="post">
    <input type="text" name="title" /><br />
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <input type="file" name="file[]" /><br />
    <textarea name="text"></textarea><br />
    <input type="submit" name="submit" /><br />
</form>
<?php
if( isset( $_POST['submit'] ) )
{
    foreach($_FILES['file']['name'] as $index => $name)
    {
        if( $_FILES['file']['error'][$index] == UPLOAD_ERR_OK )
        {
            echo "{$name}<br />";
        }
    }
}
else
{
    echo "none";
}
?>
Avatar billede pidgeot Nybegynder
15. december 2006 - 19:28 #11
Du skal have enctype="multipart/form-data" med i din <form> før at man kan uploade filer (eller rettere, for at man kan uploade filer og serveren kan se dem). Det går ikke uden den.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester