Avatar billede svjensen Nybegynder
30. oktober 2003 - 10:42 Der er 15 kommentarer og
1 løsning

Multiple file upload.

Vha. nedenstående script uploader jeg et billed, laver en thumb og skriver data til databasen.
Jeg kunne rigtigt godt tænke mig at kunne uploade flere filer på en gang.
Jeg forestiller mig at man vha. en variable angiver hvor mange filer der skal kunne uploades (så det er nemt at ændre), men da jeg er relativ ny udi PHP verdenen, er jeg lidt usikker på hvordan.
Jeg tror nu nok at jeg kan lave et loop der skriver x antal felter i formen, men hvordan skal jeg navngive dem, og hvordan sikrer jeg mig at scriptet efterfølgende uploader alle filerne og i øvrigt ignorerer eventuelle blanke felter.

///////////// SCRIPT START ///////////////
<?php
include("connection.php");

$updir = "upload/";  // Definer stien til dit oploadbibliotek
$aft = array('image/jpeg','image/pjpeg','image/png'); // De filtyper der kan uploades

/*
    Function checkgd()
    checks the version of gd, and returns "yes" when it's higher than 2
*/
function checkgd(){
    $gd2="";
    ob_start();
    phpinfo(8);
    $phpinfo=ob_get_contents();
    ob_end_clean();
    $phpinfo=strip_tags($phpinfo);
    $phpinfo=stristr($phpinfo,"gd version");
    $phpinfo=stristr($phpinfo,"version");
    preg_match('/\d/',$phpinfo,$gd);
    if ($gd[0]=='2'){$gd2="yes";}
    return $gd2;
}

/*
    Function createthumb($name,$filename,$new_w,$new_h, $updir)
    creates a resized image
    variables:
    $name        Original filename
    $filename    Filename of the resized image
    $new_w        width of resized image
    $new_h        height of resized image
*/   
function createthumb($name,$filename,$new_w,$new_h,$updir){

    global $gd2;
    $system=explode(".",$name);

    if (preg_match("/jpg|jpeg/",$system[1])){$src_img=imagecreatefromjpeg($name);}
    if (preg_match("/png/",$system[1])){$src_img=imagecreatefrompng($name);}
    $old_x=imageSX($src_img);
    $old_y=imageSY($src_img);
    if ($old_x > $old_y) {
        $thumb_w=$new_w;
        $thumb_h=$old_y*($new_h/$old_x);
    }
    if ($old_x < $old_y) {
        $thumb_w=$old_x*($new_w/$old_y);
        $thumb_h=$new_h;
    }
    if ($old_x == $old_y) {
        $thumb_w=$new_w;
        $thumb_h=$new_h;
    }
    if ($gd2==""){
        $dst_img=ImageCreate($thumb_w,$thumb_h);
        imagecopyresized($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
    }else{
        $dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
        imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
    }
    if (preg_match("/png/",$system[1])){
        imagepng($dst_img,$filename);
    } else {
        imagejpeg($dst_img,$filename);
    }
    imagedestroy($dst_img);
    imagedestroy($src_img);
}


?>
<html>
<head>
<title>Untitled Document</title>
<link href="scroll.css" type="text/css" rel="stylesheet">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#D0D0D0" text="#000000">
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">upload</font>
<br><br>
<?php
if (isset($_GET['mode']) && $_GET['mode'] == "upload") {
    $galleri = $_POST['ddgalleri'];
    $newfilename = $updir.$galleri."_".$_FILES['fil']['name'];
    $newfilename = strtolower($newfilename);
    $newthumb = $updir."thumbs/thumb_".$galleri."_".$_FILES['fil']['name'];
    $newthumb = strtolower($newthumb);

    if (empty($_REQUEST['fil'])) {
        echo "Du skal vælge en fil";
    }
    else {

      if (in_array($_FILES['fil']['type'],$aft)) {
      if (move_uploaded_file($_FILES['fil']['tmp_name'], $newfilename)) {
        $gd2=checkgd();
        createthumb($newfilename, $newthumb,100,100,$updir);

        $imginfo = getimagesize($newfilename);
        $imgwidth = $imginfo[0];  //bredde i pixels
        $imgheight = $imginfo[1]; //højde i pixels
        $imgtype = $imginfo[2];  //jpg, gif, bmp osv
        $imghtml = $imginfo[3];  //height="yyy" width="xxx" - for use directly in html
   
    $billede = explode("/",$newfilename);

    $tekst = $_POST['tekst'];
    $strSQL = "insert into galleripics (galleriid, billed, tekst, width, height) VALUES ";
    $strSQL = $strSQL."('".$galleri."', '".$billede[1]."', '".$tekst."', '".$imgwidth."', '".$imgheight."')";
    echo $strSQL;

            }
            else {}
        }
        else {
              echo "Filtypen er ikke korrekt!";
        }   
    }

}

elseif (empty($_GET['mode'])) {
    ?>

    <form action="test2.php?mode=upload" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
    <?php
    $res = mysql_query("SELECT * FROM gallerier");
    echo "<select name=ddgalleri size=1>";
    while($row = mysql_fetch_array($res)) {
    echo "<option value=".$row["galleriid"].">".$row["galleri"]."</option>";
    }
    echo "</select><br />";

    mysql_close();
    ?>
    <input type="file" name="fil"><br />
    <input type="text" name="tekst">
    <br /><br />
    <input type="submit" name="submit" value="Upload" >
    </form>

    <?php

}
else {
    echo "Bad guy!";
}
?>

</body>
</html>
////////////// SCRIPT SLUT //////////////
Avatar billede svjensen Nybegynder
30. oktober 2003 - 10:50 #1
Jeg har udbygget scriptet med:

Indsættes i toppen:
$antal_filer = 5; //Antallet af filer der skal kunne uploades.

Oprettelsen af formen:
    <form action="test2.php?mode=upload" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
    <?php
    $res = mysql_query("SELECT * FROM gallerier");
    echo "<select name=ddgalleri size=1>";
    while($row = mysql_fetch_array($res)) {
    echo "<option value=".$row["galleriid"].">".$row["galleri"]."</option>";
    }
    echo "</select><br />";

    mysql_close();
   
    for ($i=1; $i <= $antal_filer; $i++)
    {

      echo "<input type='file' name='fil'><br />";
      echo "<input type='text' name='tekst'>";
      echo "<br /><br />";
    }
?>

    <input type="submit" name="submit" value="Upload" >
    </form>

Hvilket virker fint. Der er bare lige stadigvæk problemet med navngivning.
Avatar billede detox Nybegynder
30. oktober 2003 - 11:52 #2
Du skal bruge:

for ($i=1; $i <= $antal_filer; $i++)
    {
      echo "<input type='file' name='fil[]'><br />";
      echo "<input type='text' name='tekst[]'>";
      echo "<br /><br />";
    }
Avatar billede svjensen Nybegynder
30. oktober 2003 - 12:24 #3
OK. Hvad gør jeg så i den del af scriptet der modtager data, og uploader?
Avatar billede detox Nybegynder
30. oktober 2003 - 12:30 #4
Der laver du osse en løkke, ligesom den anden. Du har så dine variabler liggende i et array:
$_FILES['fil']['name'][$i]
Avatar billede svjensen Nybegynder
30. oktober 2003 - 12:31 #5
Men hvordan kender scriptet antallet af gange løkken skal gennemløbes?
Avatar billede detox Nybegynder
30. oktober 2003 - 12:31 #6
Eksempel her:

if (in_array($_FILES['fil']['type'][$i],$aft)) {
      if (move_uploaded_file($_FILES['fil']['tmp_name'][$i], $newfilename)) {
Avatar billede detox Nybegynder
30. oktober 2003 - 12:32 #7
Jamen du har jo sat $antal_filer på den forrige side, det kunne du jo gøre igen.
Avatar billede detox Nybegynder
30. oktober 2003 - 12:36 #8
Ellers kunne du medsende oplysningen i et hidden felt:

<input type="hidden" name="antal_filer" value="<?=$antal_filer?>" />
Avatar billede detox Nybegynder
30. oktober 2003 - 12:42 #9
Altså i den her stil:

$dist = "din/sti/"; // Sti til din uploadmappe
    for ($i=0;$i<$_POST['antal_filer'];$i++) {
        if (isset($_FILES['fil']['name'][$i]) && $_FILES['fil']['name'][$i] != "") {
            $filnavn = $_FILES['fil']['name'][$i];
            if(preg_match("/.exe$|.com$|.bat$|.zip$|.doc$|.txt$/i", $filnavn)){   
                exit("Du kan ikke uploade denne filtype.");
            }
            $tempnavn = $_FILES['fil']['tmp_name'][$i];
            $sti = $dist . $filnavn;
            move_uploaded_file($tempnavn, $sti);
        }
    }
Avatar billede detox Nybegynder
30. oktober 2003 - 12:45 #10
Skulle selvfølgelig være:

$dist = "din/sti/"; // Sti til din uploadmappe
    for ($i=0;$i<$_POST['antal_filer'];$i++) {
        if (isset($_FILES['fil']['name'][$i]) && $_FILES['fil']['name'][$i] != "") {
            $filnavn = $_FILES['fil']['name'][$i];
            if (in_array($_FILES['fil']['type'][$i],$aft)) {   
                $tempnavn = $_FILES['fil']['tmp_name'][$i];
                $sti = $dist . $filnavn;
                move_uploaded_file($tempnavn, $sti);
            }
        }
    }
Avatar billede svjensen Nybegynder
30. oktober 2003 - 12:45 #11
Jeg har fået løst upload problemet, og det virker uden problemer.
Lige bortset fra at jeg ikke kan få den til at ignorere tomme felter.
Jeg har eksempelvis uploaded to billeder, og får derfor følgende besked:

Filtypen er ikke korrekt!Filtypen er ikke korrekt!Filtypen er ikke korrekt!
Avatar billede svjensen Nybegynder
30. oktober 2003 - 12:46 #12
Mit uploadscript p.t.:

////START///////////
if (isset($_GET['mode']) && $_GET['mode'] == "upload") {
    $galleri = $_POST['ddgalleri'];
    $antal_filer = $antal_filer - 1;

    for ($i=0; $i <= $antal_filer; $i++)
    {

    $newfilename = $updir.$galleri."_".$_FILES['fil']['name'][$i];
    $newfilename = strtolower($newfilename);
    $newthumb = $updir."thumbs/thumb_".$galleri."_".$_FILES['fil']['name'][$i];
    $newthumb = strtolower($newthumb);

        if (empty($_REQUEST['fil'])) {
            echo "Du skal vælge en fil";
        }
        else {

          if (in_array($_FILES['fil']['type'][$i],$aft)) {
            if (move_uploaded_file($_FILES['fil']['tmp_name'][$i], $newfilename)) {
              $gd2=checkgd();
              createthumb($newfilename, $newthumb,100,100,$updir);

              $imginfo = getimagesize($newfilename);
              $imgwidth = $imginfo[0];  //bredde i pixels
              $imgheight = $imginfo[1]; //højde i pixels
              $imgtype = $imginfo[2];  //jpg, gif, bmp osv
              $imghtml = $imginfo[3];  //height="yyy" width="xxx" - for use directly in html
   
          $billede = explode("/",$newfilename);

              $tekst = $_POST['tekst'];
          $strSQL = "insert into galleripics (galleriid, billed, tekst, width, height) VALUES ";
          $strSQL = $strSQL."('".$galleri."', '".$billede[1]."', '".$tekst[$i]."', '".$imgwidth."', '".$imgheight."')";
          echo $strSQL." :".$i."<br />";

            }
            else {}
          }
          else {
              echo "Filtypen er ikke korrekt!";
          }   
      }
    }

}
/////////SLUT///////////
Avatar billede detox Nybegynder
30. oktober 2003 - 12:51 #13
Måske sådan:

<?
if (isset($_GET['mode']) && $_GET['mode'] == "upload") {
    $galleri = $_POST['ddgalleri'];
    $antal_filer = $antal_filer - 1;

    for ($i=0; $i <= $antal_filer; $i++)
    {
    if (isset($_FILES['fil']['name'][$i]) && $_FILES['fil']['name'][$i] != "") {
        $newfilename = $updir.$galleri."_".$_FILES['fil']['name'][$i];
        $newfilename = strtolower($newfilename);
        $newthumb = $updir."thumbs/thumb_".$galleri."_".$_FILES['fil']['name'][$i];
        $newthumb = strtolower($newthumb);
   
        if (empty($_REQUEST['fil'])) {
            echo "Du skal vælge en fil";
        }
        else {

          if (in_array($_FILES['fil']['type'][$i],$aft)) {
            if (move_uploaded_file($_FILES['fil']['tmp_name'][$i], $newfilename)) {
              $gd2=checkgd();
              createthumb($newfilename, $newthumb,100,100,$updir);

              $imginfo = getimagesize($newfilename);
              $imgwidth = $imginfo[0];  //bredde i pixels
              $imgheight = $imginfo[1]; //højde i pixels
              $imgtype = $imginfo[2];  //jpg, gif, bmp osv
              $imghtml = $imginfo[3];  //height="yyy" width="xxx" - for use directly in html
   
          $billede = explode("/",$newfilename);

              $tekst = $_POST['tekst'];
          $strSQL = "insert into galleripics (galleriid, billed, tekst, width, height) VALUES ";
          $strSQL = $strSQL."('".$galleri."', '".$billede[1]."', '".$tekst[$i]."', '".$imgwidth."', '".$imgheight."')";
          echo $strSQL." :".$i."<br />";

            }
            else {}
          }
          else {
              echo "Filtypen er ikke korrekt!";
          }   
      }
    }
    }
}
?>
Avatar billede svjensen Nybegynder
30. oktober 2003 - 12:55 #14
Excellent. Det virker uden problemer nu.

Tak for hjælpen.

Husk lige et svar
Avatar billede detox Nybegynder
30. oktober 2003 - 12:56 #15
Velbekommen c",)
Avatar billede tipsen Nybegynder
30. oktober 2003 - 17:05 #16
En artikel om multiple file upload:

http://www.devarticles.com/art/1/671
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