Avatar billede Slettet bruger
23. maj 2010 - 15:00 Der er 15 kommentarer

Uploader ikke billede

Godeftermiddag.

Er endelig blevet færdig med mit galleri, og det fungerede perfekt, indtil et familiemedlem idag skulle uploade et billede. Den melder følgende fejl:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12000 bytes) in /hsphere/local/home/mikkeltt12/jkn-newzealand.km-media.dk/admin/funktion.php on line 11

Hvad betyder det?

Min funktion.php er filen hvor jeg resizer mine billeder, den ser således ud:



<?php
function imageResize( $filename, $newfilename, $maxw, $maxh, $quality=95 )
{
    $ext = strtolower(array_pop(explode(".", $filename)));
 
    switch($ext)
    {
        case 'jpeg':
        case 'jpe':
        case 'jpg':
            $srcim = imagecreatefromjpeg( $filename );
        break;
        case 'gif':
            $srcim = imagecreatefromgif( $filename );
        break;
        case 'png':
            $srcim = imagecreatefrompng( $filename );
        break;
        default:
            return false;
    }
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
 
    if($oh > $maxh || $ow > $maxw)
    {
        $wscale = $maxw / $ow;
        $hscale = ($maxh / $oh);
     
        //$scale = min( $hscale, $wscale ); //hvis billedet skal scaleres efter enten højde eller bredde
        //$scale = $hscale; //hvis billedet kun skal scaleres efter højde
        $scale = $wscale; //hvis billedet kun skal scaleres efter bredde

        $nw = round( $ow * $scale, 0 );
        $nh = round( $oh * $scale, 0 );
    }else{
        $nh = $oh;
        $nw = $ow;
    }
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
 
    switch($ext)
    {
        case 'jpeg':
        case 'jpe':
        case 'jpg':
            imagejpeg( $dstim, $newfilename, $quality );
        break;
        case 'gif':
            imagegif( $dstim );
        break;
        case 'png':
            imagesavealpha($dstim, true);
            $trans_colour = imagecolorallocatealpha($dstim, 0, 0, 0, 127);
            imagefill($dstim, 0, 0, $trans_colour);
            $png_q = floor( abs( $quality / 10 - 9.9 ) );
            imagepng( $dstim, $newfilename, $png_q );
        break;
        default:
            return false;
    }
 
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return true;
}
?>



Håber virkelig der er nogen som kan hjælpe!

Mvh
Kristoffer
Avatar billede michael_stim Ekspert
23. maj 2010 - 15:32 #1
ini_set("memory_limit","36M");

Sæt den øverst i dit script. Du kan øge 36M til den køber den.
Avatar billede RexReptiles Nybegynder
24. maj 2010 - 15:42 #2
tjooeh..
hvor stort var det billede?

det er jo heller ik rart at de overbelaster båndbredde pga uploads med meget store filer.

lav hellere et size check før upload.
Avatar billede michael_stim Ekspert
24. maj 2010 - 15:58 #3
#2
Det har ikke noget med størrelsen at gøre. De fleste webhoteller har en max uploadsize på 2 mb. Det har noget at gøre med hvor meget hukommelse der skal bruges under billedemanipuleringen.
Avatar billede Slettet bruger
25. maj 2010 - 11:50 #4
Hvad sker der omkring linje 11 i "funktion.php"
- For min "memory-limit" er kun på 16M og den kan sagtens resize store billeder (i hvert fald 8 MB)

=> Rex

Hvordan kan man size-checke et billede FØR upload ?
- jeg synes jeg har prøvet alt, men <input type=file> feltet VIL bare ikke fortælle mig hvad det indeholder (ved onchange) :(

Ideen var at "vise" billedet (med src="file:///blabla/img.jpg") i en usynlig div, og så spørge DOM hvor stort det faktisk er, inden form-submit...
Avatar billede michael_stim Ekspert
26. maj 2010 - 12:46 #5
Er det for meget forlangt med lidt response?
Avatar billede Slettet bruger
26. maj 2010 - 19:31 #6
Jeg har ikke hold øje med tråden da jeg har haft mine tanker et andet sted det sidste stykke tid. Et familiemedlem ligger med en heftig omgang kræft, og har ikke lang tid igen. Beklager den manglende opmærksomhed.

Nå, jeg fik prøvet
ini_set("memory_limit","36M");
øverst i mit script, uden held. Prøvede også at øge den.

Jeg prøvede også noget hen ad det samme i .htaccess, blot med en lidt anden linje, også uden noget resultat.
Jeg har nu skrevet til Surftown for at spørge, om det kan løses - og evt. hvordan.

Men i skal have tak for jeres forsøg på at hjælpe alligevel, jeg sætter stor pris på det.

Hvis i begge lige smider et svar, kan i lige få den smule point jeg havde tilbage til tråden :-)

Mvh
Kristoffer
Avatar billede Slettet bruger
26. maj 2010 - 20:19 #7
Hvad sker der omkring linje 11 i "funktion.php"
Avatar billede Slettet bruger
26. maj 2010 - 20:30 #8
Det var det jeg glemte at tilføje.
Da jeg ikke selv har lavet funktion-filen, må jeg hellere lade være med at snakke om noget jeg ikke har forstand på. Men håber du kan få en fornemmelse af hvad der sker på linje 11 ved at se filen:



<?php
function imageResize( $filename, $newfilename, $maxw, $maxh, $quality=95 )
{
    $ext = strtolower(array_pop(explode(".", $filename)));
 
    switch($ext)
    {
        case 'jpeg':
        case 'jpe':
        case 'jpg':
            $srcim = imagecreatefromjpeg( $filename );
        break;
        case 'gif':
            $srcim = imagecreatefromgif( $filename );
        break;
        case 'png':
            $srcim = imagecreatefrompng( $filename );
        break;
        default:
            return false;
    }
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
 
    if($oh > $maxh || $ow > $maxw)
    {
        $wscale = $maxw / $ow;
        $hscale = ($maxh / $oh);
     
        //$scale = min( $hscale, $wscale ); //hvis billedet skal scaleres efter enten højde eller bredde
        //$scale = $hscale; //hvis billedet kun skal scaleres efter højde
        $scale = $wscale; //hvis billedet kun skal scaleres efter bredde

        $nw = round( $ow * $scale, 0 );
        $nh = round( $oh * $scale, 0 );
    }else{
        $nh = $oh;
        $nw = $ow;
    }
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
 
    switch($ext)
    {
        case 'jpeg':
        case 'jpe':
        case 'jpg':
            imagejpeg( $dstim, $newfilename, $quality );
        break;
        case 'gif':
            imagegif( $dstim );
        break;
        case 'png':
            imagesavealpha($dstim, true);
            $trans_colour = imagecolorallocatealpha($dstim, 0, 0, 0, 127);
            imagefill($dstim, 0, 0, $trans_colour);
            $png_q = floor( abs( $quality / 10 - 9.9 ) );
            imagepng( $dstim, $newfilename, $png_q );
        break;
        default:
            return false;
    }
 
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return true;
}
?>



Linje 11:


            $srcim = imagecreatefromjpeg( $filename );



Håber det hjalp
Avatar billede Slettet bruger
26. maj 2010 - 21:56 #9
Godt, så ER det fordi det uploadede billede er for stort.
- det er dog ikke jpg'ens fil-størrelse du skal regne med - den er jo komprimeret.

Det faktiske memory forbrug = højde * bredde * farvedybde (typisk 3 bytes - én pr. grundfarve) sjældnere 4)

Så et billede på 1000 * 1000 vil optage 3 MB som (ukomprimeret) bitmap, men et moderne digi-kamera leverer jo rask væk billeder på 3000 * 4000 pixels
- og så er vi oppe på de famøse 36 MB

SÅ, mon ikke det var dét der skete ?

NB: Det vil altså ikke hjælpe at man komprimerer jpg'en "hårdt" inden upload - for den pakkes under alle omstændigheder ud til en bitmap svarende til originalens højde/bredde : (
Og det vil nok også være "en udfordring" at forklare "komprimering" til en standard IT-mongol...
Nok lidt lettere (ikke meget) at få dem til resize billedet inden upload.
(kan hjælpe at de som bonus får en betydeligt hurtigere upload..)
- men dét krav ødelægger jo lidt af ideen med det hele...

PS:
Du kan dog pakke din kode ind i en try/catch blok, så du kan fange fejlen når den opstår, og forklare brugeren hvad der er galt på menneskesprog, i stedet for PHP's fatal-drama : )
(= vente med at stille øv-krav til brugerne, til det faktisk GÅR galt for dem - "forresten, jeg glemte at fortælle at du ikke må uppe billeder der er større end x * y" + link til hjælpe-side...)

PPS:
Bare mærkeligt at jeg endnu ikke har oplevet det med min kode (og kun 16 MB i memory_limit)
- nok liiige noget der skal testes en gang mere..
Avatar billede RexReptiles Nybegynder
27. maj 2010 - 02:23 #10
t4nker - det har jeg nu aldrig prøvet.
jeg mener at checke tmp filen, den som "blir" uploadet

if(($_FILES["uploaded_file"]["size"] < 3000000)){
upload
}else{
upload ikke
}

tmp filen dør jo hvis den ik blir flyttet, og hvis processen stopper, laver man jo bare en besked om det også.

jeg bruger det til mit eget album da man sagtens kan uploade filer op til 7mb på mit webhotel men billedebehandlingen ik rør filer over 3mb - jeg syntes også det er voldsomt at folk uploader så store filer - der er ik ligefrem særlig venligt man skal resize sådanne KÆMPE filer.
Avatar billede olebole Juniormester
27. maj 2010 - 10:37 #11
<ole>

Der hersker en lidt sær holdning blandt webfolk. Af en eller anden uvis årsag, kan man åbenbart ikke tillade sig at forvente, folk kan bruge det kamera, de selv har købt.

Hvis Karlo køber en bil, er det helt naturligt at gå ud fra, han kan finde ud af at hælde benzin, køler- og sprinklervæske på. Køber han derimod et digitalkamera, må man endelig ikke forvente, at han helt grundlæggende kan håndtere de billeder, han tager med det.

Hvis Karlo ikke gider sætte sig ind i brugen af hans eget kamera og derfor ikke kan finde ud af at formindske sine egne billeder, kan han ikke forvente, han kan få lov til at besvære andre med sine frembringelser. At kunne foretage de simpleste former for billedbehandling er nu engang en del af det at være digi-kamera-ejer.

Just my two cents  =)

/mvh
</bole>
Avatar billede RexReptiles Nybegynder
27. maj 2010 - 13:10 #12
jeg er enig ole.

jeg ved da godt at mange idag har store forbindelser osv.
og de bare fyrer det direkte afsted, men hvis vi går bare et par år tilbage ville ingen ha tålmodighed til at uploade billeder i størrelsen 1mb eller over.

de folk der bruger mit system er ganske fornuftige til at bruge deres digi cams, så jeg har aldrig oplevet folk klager over at få en "hovsa, kan du ik lige formindske dit voldsomme billede lidt" besked.

normalt tager man også kun meget store billeder til brug i redigering, normalt hvis jeg er ude står mit eget cam til en opløsning af 1600x1200 som gir cirka 1,8mb filer - de blir hverken grynede eller noget af den grund, og eftersom de sjældent skal redigeres så er de fine til upload derfra.
Avatar billede Slettet bruger
27. maj 2010 - 19:15 #13
@rex

if(($_FILES["uploaded_file"]["size"] < 3000000)){
upload
}else{
upload ikke
}

Det er jo netop ikke filens størrelse der har betydning, men billedets dimensioner.
- men ideen er god, for dimensionerne kan man jo også "trække ud" inden man beslutter at køre videre til imagecreatefromjpeg() - Med noget ala:

list($width, $height, $type) = getimagesize($_FILES['uploaded_file']['tmp_name']);

if ($width * $height * 3 + $sikkermedsMargin > ini_set('memory_limit'))
    crapOut("Dit billede er absurd stort - Dur ikke, væk!");
else
    {
    ...
    ..
    .
Avatar billede Slettet bruger
27. maj 2010 - 19:16 #14
ini_get selvfølgelig
Avatar billede Slettet bruger
27. maj 2010 - 21:41 #15
Lidt respons til Ole:

Galleriet jeg laver er kun tilpasset en enkelt person - min søster. Hun er i New-Zealand og skal være det i yderligere 6 måneder (ca.). Hun har brugt en del penge på hendes hobby, bl.a. et heftigt spejlreflekskamera. Hun er ansat inden for landbruget, og arbejder fra tidlig morgen til sen aften. Hun har fri 2-3 dage pr. 14 dage, og dem bruger hun ofte - hvis ikke altid - på at tage ud for at se resten af landet, hvilket man ikke kan fortænke hende i. Hun rammer uden for den målgruppe du beskriver. Hun har ikke særlig meget - for ikke at sige slet ikke - styr på det med computer. Men til gengæld kan hun dælme finde ud af at tage billeder. Hun kunne sikkert godt lære at formindske hendes billeder, men det er lidt svært at undervise hende med den afstand der er imellem mig og hende. Og hvis ikke det skulle være grund nok, så har hun simpelthen bare ikke tiden til det. Så jeg søger ikke et kompromis, men en løsning på problemet.

Men hvis vi lige glemmer dette særtilfælde, vil jeg selvfølgelig give dig ret. De fleste folk idag bør kunne håndtere det mest basale billedredigering.

Men lige nu har jeg brug for at kunne give tilladelse til upload af nogle rimelige store filer.

Mvh
Kristoffer
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