Oprettet søn. d. 23. maj 2010 kl. 15:00:56

Choxie (nedlagt brugerprofil)
Choxie (nedlagt brugerprofil) (3.135 point. Point ude: 30)

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

Skrevet søn. d. 23. maj 2010 kl. 15:32:50| #1

ini_set("memory_limit","36M");

Sæt den øverst i dit script. Du kan øge 36M til den køber den.

Skrevet man. d. 24. maj 2010 kl. 15:42:17| #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.

Skrevet man. d. 24. maj 2010 kl. 15:58:40| #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.

Skrevet tir. d. 25. maj 2010 kl. 11:50:13| #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...

Skrevet ons. d. 26. maj 2010 kl. 12:46:28| #5

Er det for meget forlangt med lidt response?

Skrevet ons. d. 26. maj 2010 kl. 19:31:16| #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

Skrevet ons. d. 26. maj 2010 kl. 20:19:20| #7

Hvad sker der omkring linje 11 i "funktion.php"

Skrevet ons. d. 26. maj 2010 kl. 20:30:19| #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

Skrevet ons. d. 26. maj 2010 kl. 21:56:12| #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..

Skrevet tor. d. 27. maj 2010 kl. 02:23:03| #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.

Skrevet tor. d. 27. maj 2010 kl. 10:37:11| #11

olebole
olebole (214.028 point)
<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>

Skrevet tor. d. 27. maj 2010 kl. 13:10:32| #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.

Skrevet tor. d. 27. maj 2010 kl. 19:15:00| #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
    {
    ...
    ..
    .

Skrevet tor. d. 27. maj 2010 kl. 19:16:40| #14


Skrevet tor. d. 27. maj 2010 kl. 21:41:19| #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

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Udtræk af enkelte felter fra bestemte kolonner i mysql

Oprettet den 11. februar 2012 kl. 19.27
hrole giver 30 point for svar | Giv et svar »

Procentregning

Oprettet den 11. februar 2012 kl. 11.26
sevinding giver 60 point for svar | Giv et svar »

Ville ikke tildele at upload det til database eller komme...

Oprettet den 10. februar 2012 kl. 21.23
tobrukDk giver 15 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger