Avatar billede JJ77 Juniormester
27. maj 2006 - 22:20 Der er 20 kommentarer og
1 løsning

Problemer med upload af billede?

Hej eksperter.

Jeg har nedenstående kode som gør det muligt at uploade et billede til en annonce. Men jeg har pludselig opdaget at der åbenbart er visse typer formater som ikke kan uploades, altså billeder med for store dimensioner fx, 2500x2800 (bare et exempel) selv om billedet ikke fylder over den tilladte grænse.
Nedenstående vises min kode.. Hvordan løses dette?

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $result = false;
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    $result = imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return $result;
}

$allowPics = array("jpg","jpeg","jpe","JPG","JPEG","JPE");

    if(mysql_affected_rows()>0)
    {
        $errmsg = "";
        $artikelID = mysql_insert_id();
        for($i = 1; $i <= 1; $i++)
        {       
            if($_FILES['imagefile']['size'][$i] > 2048000)
            {
                echo " <script type=\"text/javascript\">
                    alert(\"Dit billede var for stort, og kunne \nderfor ikke komme med i annoncen!\");
                    </script>";
            }
            else
            {
                $extension = strtolower(end(explode(".",$_FILES['imagefile']['name'][$i])));
                if(!in_array($extension,$allowPics))
                {   
                    $errmsg .= "Billede " . $i . " er forkert type, kun jpeg!<br>";
                }
                else
                {
                    $dato = date("y-m-d h:i:s");
                    resize($_FILES['imagefile']['tmp_name'][$i],"latest.img",350,350);
                    $instr = fopen("latest.img","rb");
                    $image = addslashes(fread($instr,filesize("latest.img"))); 
                               
                    mysql_query ("insert into billeder_salgAfProdukt (id, artikelid, pic, oprettetDato)
                    values ('', ".$artikelID.",'".$image."','.$dato.')") or die(mysql_error());
                }
            }
        }
Avatar billede jakobdo Ekspert
28. maj 2006 - 14:23 #1
Jeg tror 2500x2500 bruger for meget hukommelse.
Hvad du du i memory_limit ?
Ellers må du give dine brguere besked på at billedet max må være 1024x768 eller 1mb eller noget.
Ellers skal du have rettet memory_limit, så du må bruge mere hukommelse.
Avatar billede JJ77 Juniormester
28. maj 2006 - 15:21 #2
ok.. det er bare lidt mystisk.. jeg kan fx godt uploade et billede som fylder ca 2 megabytes, hvis bare formatet er under en vis grænse:~).. problemet kommer kun når selve formatet er meget stort..
Avatar billede jakobdo Ekspert
28. maj 2006 - 16:53 #3
Ja, og det er netop problemet.
Koden fejler i dette kald:
$srcim = imagecreatefromjpeg( $filename );
Og den eneste løsning jeg selv har fundet er at sætte memory_limit() op.
Kunne ikke få den til at smide en fejl på anden måde.
Enten skal man så teste size før man gør yderligere.
Avatar billede JJ77 Juniormester
28. maj 2006 - 17:15 #4
ok... nu skulle du tilfældigvis ikke vide hvordan man gør det hos b-one... kan sikkert ikke lade sig gøre:-(
Avatar billede jakobdo Ekspert
28. maj 2006 - 17:19 #5
Du kan da prøve at lave en .htacess fil og lægge den i samme dir som din uploadfil:

<FilesMatch "\.(php|html?)$">
php_value memory_limit 16M
</FilesMatch>

16M = 16 MB
Du kan så evt. se hvad den er nu, via: phpinfo() og så sætte den noget over det.
Men det er ikke sikkert det virker. (det burde det ikke, hvis B-One har sikret deres webhoteller)
Avatar billede JJ77 Juniormester
28. maj 2006 - 17:20 #6
Hvis ikke hvordan fortæller jeg brugeren at billedet er for stort inden annoncen oprettes, altså har for store dimensioner?
Avatar billede jakobdo Ekspert
28. maj 2006 - 17:25 #7
Du kunne f.eks. sammen med koden:
if($_FILES['imagefile']['size'][$i] > 2048000)
Lave et tjek ala:
$size = getimagesize($_FILES['imagefile']['name'][$i]);
if($size[1] > 1000)
echo "Height above 1000, error";
if($size[2] > 1000)
echo "Width above 1000, error";
Avatar billede JJ77 Juniormester
29. maj 2006 - 15:30 #8
Hej igen.. har skrevet til b-one og forhørt mig om deres memory_limit.. den er på 16mb.. hva så?
Avatar billede jakobdo Ekspert
29. maj 2006 - 16:03 #9
Så skal du evt overveje løsningen:

if($size[1] > 1000)
echo "Height above 1000, error";
if($size[2] > 1000)
echo "Width above 1000, error";
Avatar billede JJ77 Juniormester
29. maj 2006 - 16:28 #10
skal det så se sådan ud:
      $allowPics = array("jpg","jpeg","jpe","JPG","JPEG","JPE");

    if(mysql_affected_rows()>0)
    {
        $errmsg = "";
        $artikelID = mysql_insert_id();
        for($i = 1; $i <= 1; $i++)
        {       
            if($_FILES['imagefile']['size'][$i] > 2048000)
            {
                echo " <script type=\"text/javascript\">
                    alert(\"Dit billede var for stort, og kunne \nderfor ikke komme med i annoncen!\");
                    </script>";
            }
        else if(
            if($size[1] > 1000)
            echo "Height above 1000, error";
            if($size[2] > 1000)
            echo "Width above 1000, error";)
            {
                echo " <script type=\"text/javascript\">
                    alert(\"Dit billede var for stort, og kunne \nderfor ikke komme med i annoncen!\");
                    </script>";
            }

            else
            {
                $extension = strtolower(end(explode(".",$_FILES['imagefile']['name'][$i])));
                if(!in_array($extension,$allowPics))
                {   
                    $errmsg .= "Billede " . $i . " er forkert type, kun jpeg!<br>";
                }
                else
                {
                    $dato = date("y-m-d h:i:s");
                    resize($_FILES['imagefile']['tmp_name'][$i],"latest.img",350,350);
                    $instr = fopen("latest.img","rb");
                    $image = addslashes(fread($instr,filesize("latest.img"))); 
                               
                    mysql_query ("insert into billeder_salgAfProdukt (id, artikelid, pic, oprettetDato)
                    values ('', ".$artikelID.",'".$image."','.$dato.')") or die(mysql_error());
                }
            }
        }
Avatar billede jakobdo Ekspert
29. maj 2006 - 17:31 #11
Du burde kunne nøjes med et billede tjek i stil med:

$imageSize = getimagesize($_FILES['imagefile']['tmp_name'][$i]);
if($_FILES['imagefile']['size'][$i] > 2048000 || ($imageSize[1]>1000 || $imageSize[2]>1000))
{
    echo " <script type=\"text/javascript\">
  alert(\"Dit billede var for stort, og kunne \nderfor ikke komme med i annoncen!\");
  </script>";
}
Avatar billede oldnick Nybegynder
30. maj 2006 - 02:15 #12
Er der ikke en mulighed for at resize billede før man sender det videre, så man ikke er begrænset af fil størrelse?? Måske et dumt spørgsmål, men jeg har det samme problem og det må da kunne lade sig gøre!
Avatar billede jakobdo Ekspert
30. maj 2006 - 08:27 #13
Du kan godt resize billede på din computer inden du uploader billedet.
Men ellers skal billedet jo først op til serveren, så kan det resizes og efterfølgende gemmes.
Avatar billede oldnick Nybegynder
30. maj 2006 - 17:30 #14
he he, jeg fik vist formuleret mig lidt forkert. Jeg er godt klar over at man resize på sin computer, men hvis jeg nu laver en siden til en som ikke har mulighed for det eller simplthen ikke kan finde ud af det. Så ville det jo være lækkert hvis de bare kunne tage deres .jpg og smide det afsted ud at skulle bekymre sig om at resize.

Det jeg mente var at man i scriptet kunne få resize til at ske som det første, men det er vist også det som der står i scriptet, så et dumt spørgsmål. :)

Jeg tænkte at det må da bare være muligt at lave et script som er fuldstændig ligeglad med størrelse og fil type??
Avatar billede jakobdo Ekspert
30. maj 2006 - 17:40 #15
Det er også muligt.
Men er du interesseret i at modtage en fil på 1gb? (bare et søgt eksempel)
Avatar billede oldnick Nybegynder
30. maj 2006 - 17:47 #16
Nej, selvfølgelig ikke, men man kunne måske godt tænke sig, mere end 1 mb måske 5mb.. som så blev resizet og komprimeret? :)
Avatar billede jakobdo Ekspert
30. maj 2006 - 17:50 #17
Du mener konvertere til jpeg 50% kvalitet eller lign, det kan man også godt.
Og man kan godt rette til 5mb, intet problem i det. :o)
Avatar billede oldnick Nybegynder
30. maj 2006 - 17:55 #18
ok, men jeg kan bare ikke få det til at virke, med det script jeg har (tro faktisk at du har hjulpet mig med at skrive et :) ), det ligner meget det oven for men med nogle små ændringer.
Avatar billede jakobdo Ekspert
30. maj 2006 - 20:18 #19
Kan du ikke evt oprette en tråd med dit spørgsmål og kode?
Det er ikke pænt vi spammer montana's tråd her.
Avatar billede oldnick Nybegynder
30. maj 2006 - 21:00 #20
Ja, du har ret: Jeg har oprettet et spg: http://www.eksperten.dk/spm/712824
Avatar billede JJ77 Juniormester
31. august 2006 - 23:12 #21
lukker
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