Avatar billede svjensen Nybegynder
15. november 2006 - 23:16 Der er 9 kommentarer og
1 løsning

filtype attribut returneres ikke

Jeg anvender PHP 5.2.0. og har et billede upload script der driller.

Scriptet returnerer ikke $_FILES['fil']['type'][$i] for den valgte fil, hvilket er sat som en forudsætning i scriptet, da jeg ønsker at teste mod tilladte filtyper.

Hvad kan være problemet?



SCRIPT
************************
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($_FILES['fil']))
            {
                echo "Du skal vælge en fil";
            }
            else
            {
                echo $_FILES['fil']['type'][$i][$i]."<br>";
                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."')";
                        $res = mysql_query($strSQL);
                        echo "Billedet ".$billede[1]." er nu uploadet, og inkluderet i galleriet.<br />";
                    }
                    else
                    {
                    }
                }
                else
                {
                    echo "Filtypen er ikke korrekt!";
                }
            }
        }
    }
}
Avatar billede ellebaek Nybegynder
15. november 2006 - 23:35 #1
er det i det hele taget, eller kun når du udskriver den...

for du har da en [$i] for meget i denne linie:
echo $_FILES['fil']['type'][$i][$i]."<br>";
Avatar billede svjensen Nybegynder
16. november 2006 - 07:45 #2
Det er i det hele taget. Jeg havner i den nederste 'echo', og får altså at vide at filtypen ikke er korrekt (selvom det er en .jpg, hvilket er en af de tilladte).
Avatar billede mcardle Nybegynder
16. november 2006 - 13:12 #3
Er det i IE eller i FF..?

Jeg har taget det her fra http://us3.php.net/features.file-upload

I had problems when uploading files using Internet Explorer and Firefox. I checked for extension and mime-type to make sure it was a jpeg-file my users uploaded. Firefox did it well, only Internet Explorer failed to accept the file saying it wasn't the correct mime-type. After some testing, I discovered that Firefox reads the mime-type of a Jpeg-image as:

image/jpeg

While Internet Explorer reads it as:

image/pjpeg

I hope this helps somebody to avoid an evening debugging. To contribute to php.net, I enclosed my secure upload script for Jpeg files:

<?php
 
  function storefile($var, $location, $filename=NULL, $maxfilesize=NULL) {
  $ok = false;

  // Check file
  $mime = $_FILES[$var]["type"];
  if($mime=="image/jpeg" || $mime=="image/pjpeg") {
    // Mime type is correct
    // Check extension
    $name  = $_FILES[$var]["name"];
    $array = explode(".", $name);
    $nr    = count($array);
    $ext  = $array[$nr-1];
    if($ext=="jpg" || $ext=="jpeg") {
      $ok = true;
    }
  }
 
  if(isset($maxfilesize)) {
    if($_FILES[$var]["size"] > $maxfilesize) {
      $ok = false;
    }
  }
 
  if($ok==true) {
    $tempname = $_FILES[$var]['tmp_name'];
    if(isset($filename)) {
      $uploadpath = $location.$filename;
    } else {
      $uploadpath = $location.$_FILES[$var]['name'];
    }
    if(is_uploaded_file($_FILES[$var]['tmp_name'])) { 
      while(move_uploaded_file($tempname, $uploadpath)) {
        // Wait for the script to finish its upload   
      }
    }
    return true;
  } else {
    return false;
  }
  }

?>

You can use this script as follow:

<?

if(isset($_FILES['name'])) {
  if(storefile("name", $_SERVER['DOCUMENT_ROOT']."test/img")) {
  echo("Upload succeeded!");
  } else {
  echo("Upload failed...");
  }
}

?>

The last 2 parameters 'filename' and 'maxfilesize' are optional. Offcourse, you can change this script with other mime types and extensions to fit your needs.
Avatar billede svjensen Nybegynder
16. november 2006 - 13:36 #4
Jeg har kun testet i IE.

Jeg vil forsøge mig med scriptet oven for i aften, når jeg er hjemme fra arbejde.
Avatar billede svjensen Nybegynder
16. november 2006 - 15:04 #5
Det ekstra '[$i]' er kommet ind som en fejl. Det fremgår ikke af scriptet.
Scriptet tager hensyn til 'pjeg' eller 'jpeg' problematikken, idet det array filtypen testes imod indeholder begge.

Med mindre der er andre gode ideer, prøver jeg det foreslåede script senere i dag.

For en god orden skyld får I lige hele mit script:

*************************
<?

$_SESSION['this_page'] = "galleriupload.php";

$updir = "gallery/";  // Definer stien til dit oploadbibliotek
$aft = array('image/jpeg','image/pjpeg','image/png'); // De filtyper der kan uploades
$antal_filer = 5; //Antallet af filer der skal kunne 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);
}

?>


<center>
<br><br>
<?php
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($_FILES['fil']))
            {
                echo "Du skal vælge en fil";
            }
            else
            {
                echo $_FILES['fil']['type'][$i]."<br>";
                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."')";
                        $res = mysql_query($strSQL);
                        echo "Billedet ".$billede[1]." er nu uploadet, og inkluderet i galleriet.<br />";
                    }
                    else
                    {
                    }
                }
                else
                {
                    echo "Filtypen er ikke korrekt!";
                }
            }
        }
    }
}

elseif (empty($_GET['mode']))
{
?>
    <table>
    <form action="index.php?show_page=galleriupload.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 "<tr><td colspan=2 class=TDCenter><select name=ddgalleri size=1>";
    while($row = mysql_fetch_array($res))
    {
        echo "<option value=".$row["uid"].">".$row["galleri"]."</option>";
    }
    echo "</select></td></tr>";
    echo "<tr><td colspan=2>&nbsp;</td></tr>";
   
    for ($i=1; $i <= $antal_filer; $i++)
    {
        echo "<tr><td class=TDRight>Vælg fil:</td><td><input type='file' name='fil[]'></td></tr>";
        echo "<tr><td class=TDRight>Skriv tekst:</td><td><input type='text' name='tekst[]'></td></tr>";
        echo "<tr><td colspan=2 class=TDCenter>&nbsp;</td></tr>";
    }
?>
    <tr><td colspan=2 class=TDCenter><input type="submit" name="submit" value="Upload"></td></tr>
    </form>
    </table>
<?php

}
echo "<hr width='50%'>";
echo "<br><a href=index.php?show_page=galleri.php>Retur til gallerioversigten</a>";
echo "&nbsp;&nbsp;&nbsp;&nbsp;";
echo "<a href=index.php?show_page=galleriupload.php>Upload flere billeder</a>";
echo "<br><br>";
echo "<a href=index.php?show_page=gallerykat.php>Administrer kategorierne</a>";

?>
Avatar billede sw_red_6 Nybegynder
16. november 2006 - 15:07 #6
bare for at tjekke at det nu også er en tilladt type har du så prøvet at lave en echo/print af $_FILES['fil']['type'][$i] ?
Avatar billede svjensen Nybegynder
16. november 2006 - 15:17 #7
Jep.

Og den er blank, hvilket er hele problemet.
Avatar billede svjensen Nybegynder
16. november 2006 - 23:32 #8
Det viser sig at scriptet vil acceptere nogle .jpg filer men ikke andre.
Jeg har fx to billeder taget med mit kamera, hvoraf scriptet accepterer det ene men ikke det andet.
Er der nogen der kan hjælpe med en forklaring?
Avatar billede svjensen Nybegynder
16. november 2006 - 23:36 #9
Det ene billede returnere 'image/pjpeg' mens ['type'] for det andet billede er blank.
Avatar billede svjensen Nybegynder
25. juni 2008 - 10:52 #10
Lukker.
Løsning er ikke fundet
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