Avatar billede Jingz Nybegynder
13. april 2011 - 20:12 Der er 12 kommentarer og
1 løsning

Foreach upload fungerer ikke

Hej alle.

Jeg sidder lige med et problem med en foreach lykke til en imageupload.

Problemet er at den kun vil uploade 1 fil, selvom at der er 3 inputs.

Her er koden:

<form method="post" enctype="multipart/form-data">
<input type="file" name="fil1" ><br />
<input type="file" name="fil2" ><br />
<input type="file" name="fil3" ><br />
<input type="submit" name="filupload" value="Upload" />
</form>

if(billedupload($_FILES))
{
echo "SUCCESS!";
}


function billedupload($_FILES)
{
       
foreach($_FILES as $arrfile){   

$allow_types = array("jpg","gif","png");
                   
$upload_dir = "public/images/test/";
           

if (is_uploaded_file($arrfile["tmp_name"]))
{
$file_ext = strtolower(pathinfo($arrfile["name"], PATHINFO_EXTENSION));
                       
$newname = date('dmyHis').mt_rand().".".$file_ext;
                           
if (in_array($file_ext, $allow_types))
{

if (move_uploaded_file($arrfile["tmp_name"], $upload_dir.$newname))
{
                                   
$image_path = $upload_dir.$newname;
                       
$image_path_new = "public/images/test/thumbs/thumb_".$newname;
                       
$image = open_image($image_path);
                       
$width = imagesx($image);
$height = imagesy($image);
                           
$width_new = 270;
$height_new = $height * ($width_new / $width);
                           
$image_resized = imagecreatetruecolor($width_new, $height_new);
                        imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $width_new, $height_new, $width, $height);
                           
if (!isset($image_resized))
{
$image_resized = $image;
};
                       
                        imagejpeg($image_resized, $image_path_new);
                               
return "SUCCESS!";
                                       
} else {
return false;
};
                   
} else {
return false;
};
           
} else {
return false;
};

};
       
};


Er der nogen der kan se hvad der er galt?
Avatar billede repox Seniormester
13. april 2011 - 20:18 #1
Det er fordi du ikke kan bruge foreach() på fil-arrayet - så skal du ihvertfald snyde med det.

Kig i manualen, der får du forklaringen på hvorfor : http://www.php.net/manual/en/features.file-upload.multiple.php
Avatar billede jakobdo Ekspert
13. april 2011 - 20:18 #2
Jeg er lidt usikker på om dette vil virke...
foreach($_FILES as $arrfile){   

Prøv lige at udskriv:

echo '<pre>';
print_r($_FILES);
echo '</pre>';

Alternativt ret din form til:

<input type="file" name="fil[]" ><br />
<input type="file" name="fil[]" ><br />
<input type="file" name="fil[]" ><br />

Så burde du kunne lave:

foreach($_FILES['fil'] ...)
Avatar billede repox Seniormester
13. april 2011 - 20:23 #3
#2
Det multidimensionelle array vil snyde - for at tilgå de enkelte arrays, skal du skrive
$_FILES["fil"]["name"][0]
$_FILES["fil"]["name"][1]
$_FILES["fil"]["name"][2]


Så det ville være bedre at tælle op og lave en while/for henover.
Avatar billede Jingz Nybegynder
13. april 2011 - 20:25 #4
en udskrift af $_FILES er fx:

Array
(
    [fil1] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] => 0
        )

    [fil2] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] => 0
        )

    [fil3] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] => 0
        )

)

Det er bare et ganske almindeligt array, og jeg mener bestemt at det skulle være muligt at bruge foreach med $_FILES.
Avatar billede jakobdo Ekspert
13. april 2011 - 20:31 #5
Du kan jo debugge lidt videre...

Inden i din foreach.
Prøv da at udskriv:

foreach($_FILES as $arrfile){   

echo '<pre>';
print_r($arrfile);
echo '</pre>';
Avatar billede Jingz Nybegynder
13. april 2011 - 20:40 #6
foreach($_FILES as $arrfile)
{
  echo "<pre>";
  print_r($arrfile);
  echo "</pre>";
};

Dette giver:

Array
(
    [name] => 0712100109591925786132.jpg
    [type] => image/jpeg
    [tmp_name] => C:\wamp\tmp\php4D9F.tmp
    [error] => 0
    [size] => 147996
)
Array
(
    [name] => 071210011754201259684.jpg
    [type] => image/jpeg
    [tmp_name] => C:\wamp\tmp\php4DAF.tmp
    [error] => 0
    [size] => 152871
)
Array
(
    [name] => 0712100100151040764086.jpg
    [type] => image/jpeg
    [tmp_name] => C:\wamp\tmp\php4DB0.tmp
    [error] => 0
    [size] => 129443
)

Så det er som det skal være
Avatar billede jakobdo Ekspert
13. april 2011 - 20:46 #7
Debug videre i din kode.
Så kan du selv finde fejlen. :o)
Eller hvor den fejler.
Nu kan jeg se du kører windows.
Måske der mangler nogle rettigheder.
Avatar billede Jingz Nybegynder
13. april 2011 - 20:47 #8
hvilke rettigheder tænker du på?

Den uploader jo hjertens gerne et enkelt billede, men ikke flere.
Avatar billede jakobdo Ekspert
13. april 2011 - 20:56 #9
Det er jo klar den kun uploader en.
Følg din kode, og du vil se du har en return "SUCCESS!"; eller FALSE, hvis upload går godt eller skidt.
Men denne return komme inden dit loop er færdig med alle 3 filer.
Så du skal flytte din return uden for loopet, så du når at køre alle filerne igennem.
Avatar billede jakobdo Ekspert
13. april 2011 - 20:58 #10
if(billedupload($_FILES)){
  echo "SUCCESS!";
}

function billedupload($_FILES){
  foreach($_FILES as $arrfile){
    $allow_types = array("jpg","gif","png");
    $upload_dir = "public/images/test/";

    if (is_uploaded_file($arrfile["tmp_name"])){
      $file_ext = strtolower(pathinfo($arrfile["name"], PATHINFO_EXTENSION));
      $newname = date('dmyHis').mt_rand().".".$file_ext;
     
      if (in_array($file_ext, $allow_types)){
        if (move_uploaded_file($arrfile["tmp_name"], $upload_dir.$newname)){
          $image_path = $upload_dir.$newname;
          $image_path_new = "public/images/test/thumbs/thumb_".$newname;
          $image = open_image($image_path);
          $width = imagesx($image);
          $height = imagesy($image);
          $width_new = 270;
          $height_new = $height * ($width_new / $width);
          $image_resized = imagecreatetruecolor($width_new, $height_new);
          imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $width_new, $height_new, $width, $height);
          if (!isset($image_resized)){
            $image_resized = $image;
          }
          imagejpeg($image_resized, $image_path_new);
        }else{
          return false;
        }
      } else {
        return false;
      }
    } else {
      return false;
    }
  }
  return true;
}
Avatar billede Jingz Nybegynder
13. april 2011 - 21:01 #11
Oh dear god.

Det er pinligt :S

Tusind tak for hjælpen :) smid lige et svar, så får du pointene.

Works like a charm now.
Avatar billede jakobdo Ekspert
13. april 2011 - 21:06 #12
Svar
Avatar billede jakobdo Ekspert
13. april 2011 - 21:10 #13
Takker for point.
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