Avatar billede peter_g_j Nybegynder
17. august 2007 - 12:27 Der er 7 kommentarer og
1 løsning

Upload af billede

Jeg forsøger at lave mit eget fotoalbum, og jeg bruger et stykke kode jeg tidligere har brugt uden problemer til at uploade billederne, men nu kommer der denne fejl når billederne overstiger ca 250 kb. Nogen ide om hvad der er galt, og hvordan det kan løses?



Fejl:

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 6400 bytes) in /customers/06-65.dk/06-65.dk/httpd.www/test/album_gem.php on line 46




Koden jeg bruger til at uploade billedet:

$sti = "./upload/";
$thumb_sti = "./upload/thumb/";
$allow_files = array("jpg", "bmp", "png", "gif", "JPG", "BMP", "PNG", "GIF");
$size = 1000000000; //I bytes
$ext = pathinfo($_FILES['thumb']['name']);
if(in_array($ext["extension"], $allow_files)) {
    if($_FILES['thumb']['size'] <= $size) {
        if(is_uploaded_file($_FILES['thumb']['tmp_name'])) {
              $nyt_navn = uniqid(getmypid()) . '.' . $ext['extension'];
              move_uploaded_file($_FILES['thumb']['tmp_name'], $sti . $nyt_navn);
            $nyt_navn2 = $sti . 'ny' . $nyt_navn;
            $thumb_navn = $thumb_sti . 'thumb' . $nyt_navn;
            $nyt_navn = $sti . $nyt_navn;
            $targetfile = $nyt_navn2;
            $thumb_targetfile = $thumb_navn;
                   
            list($width, $height) = getimagesize($nyt_navn);
            $nheight = ($height*400)/$width;
            $thumb_nheight = ($height*120)/$width;
            $nheight = round($nheight);
            $thumb_nheight = round($thumb_nheight);
            $foto = imagecreatetruecolor(400, $nheight);
            $thumb_foto = imagecreatetruecolor(120, $thumb_nheight);
            $kilde = imagecreatefromjpeg($nyt_navn);
            $thumb_kilde = imagecreatefromjpeg($nyt_navn);
            imagecopyresampled($foto, $kilde, 0, 0, 0, 0, 400, $nheight, $width, $height);
            imagecopyresampled($thumb_foto, $thumb_kilde, 0, 0, 0, 0, 120, $thumb_nheight, $width, $height);
            imagejpeg($foto, $targetfile, 100);
            imagejpeg($thumb_foto, $thumb_targetfile, 30);
Avatar billede barklund Nybegynder
17. august 2007 - 12:57 #1
Der er jo lige præcis det galt, som fejlen siger. Scriptet er begrænset til max at bruge 16777216 bytes og det kræver mere at læse store billeder ind (pixel-størrelse, ikke filstørrelse af original).

Du kan hæve grænsen (hvis serveren tillader det) for eksempel til at være uendelig med:

ini_set("memory_limit", "-1");

Det kan du dog kun (inden php 5.2.1), hvis php er compiled med -enable-memory-limit. Det vil du kunne se på en phpinfo().

Læs mere her:

http://dk2.php.net/manual/en/ini.core.php#ini.memory-limit

--
Morten Barklund
Avatar billede olebole Juniormester
17. august 2007 - 15:16 #2
<ole>

Hvad skal så store billeder på nettet - med mindre der er tale om f.eks. pressebilleder til download og tryk?  =)

/mvh
</bole>
Avatar billede peter_g_j Nybegynder
17. august 2007 - 16:49 #3
Barklund, tak for forslaget, men det hjalp ikke.

Jeg synes da ikke 250 kb er særlig stort, og det er billdet jeg prøver at uploade til behandling af scriptet. Jeg har fået en forklaring på at det kan være fordi de bliver pakket ud, før de kan komprimeres igen, og der fylder det over 16mb. Jeg har tidliger brugt scriptet på et andet webhotel, og der er resultatet at billederne fylder ca 100-300 kb, alt efter om de er taget vertikalt eller hoisontalt.

Så jeg skal jeg skal bruge en løsning, hvor de ikke kommer til at fylde så meget når de bliver komprimeret.
Avatar billede dkfire Nybegynder
18. august 2007 - 11:50 #4
Det lader til du allerede har fået svaret på dit problem.

Det er rigtig at selv om du uploader et billede somi komprimeret tilstand fylder 250kb, vil dit script udpakke billeder, og derved få det til at fylde mere. Den eneste løsning som findes det dette problem er enten selv at ændre på størrelsen af billedet, og derved ikke kører scriptet, eller at finde et bedre webhotel med mere hukommelse tilrådighed.

Du kan selvfølgelig også gøre noget som er lidt smartere. Se på dit script og undersøg hvad der bruger hukommelse.
I stedet for at lave to billeder på samme tid, som du gør lige nu, og som optager dobbelt hukommelse, så kunne du vælge at lave et billede først og derefter frigive hukommelsen og så lave det andet billede.
Avatar billede dkfire Nybegynder
18. august 2007 - 12:11 #5
Her er hvad jeg synes du skulle prøve: 

$sti = "./upload/";
$thumb_sti = "./upload/thumb/";
$allow_files = array("jpg", "bmp", "png", "gif", "JPG", "BMP", "PNG", "GIF");
$size = 1000000000; //I bytes
$ext = pathinfo($_FILES['thumb']['name']);
if(in_array($ext["extension"], $allow_files)) {
    if($_FILES['thumb']['size'] <= $size) {
        if(is_uploaded_file($_FILES['thumb']['tmp_name'])) {
              $nyt_navn = uniqid(getmypid()) . '.' . $ext['extension'];
              move_uploaded_file($_FILES['thumb']['tmp_name'], $sti . $nyt_navn);
            $nyt_navn2 = $sti . 'ny' . $nyt_navn;
            $thumb_navn = $thumb_sti . 'thumb' . $nyt_navn;
            $nyt_navn = $sti . $nyt_navn;
            $targetfile = $nyt_navn2;
            $thumb_targetfile = $thumb_navn;
                 
            list($width, $height) = getimagesize($nyt_navn);
            $nheight = ($height*400)/$width;
            $thumb_nheight = ($height*120)/$width;
            $nheight = round($nheight);
            $thumb_nheight = round($thumb_nheight);
            $foto = imagecreatetruecolor(400, $nheight);
            $kilde = imagecreatefromjpeg($nyt_navn);
            imagecopyresampled($foto, $kilde, 0, 0, 0, 0, 400, $nheight, $width, $height);
            imagejpeg($foto, $targetfile, 100);
            imagedestroy($foto);

            $thumb_foto = imagecreatetruecolor(120, $thumb_nheight);
            imagecopyresampled($thumb_foto, $kilde, 0, 0, 0, 0, 120, $thumb_nheight, $width, $height);
            imagejpeg($thumb_foto, $thumb_targetfile, 30);
            imagedestroy($thumb_foto);
            imagedestroy($kilde);



Nu har du ikke lige vist hele koden, så jeg har selvfølgelig kun ændret på det du har vist. Prøv at se om dette ikke vil hjælpe dig.
Avatar billede peter_g_j Nybegynder
18. august 2007 - 14:52 #6
Det eneste der er udover det viste, er at den modtager oplysningerne om filen der skal uploades, og at den skriver lidt i et par mysql db bagefter. Men med den opdatering du er kommet med der, dkfire, så er det lykkes mig at uploade billeder på over 1 mb, så det er jo langt mere anvendeligt. :)

Mange tak for hjælpen, smid et svar :)
Avatar billede dkfire Nybegynder
18. august 2007 - 16:40 #7
Ja det var så lidt. Ligger lige et svar. :-)
Avatar billede olebole Juniormester
18. august 2007 - 20:58 #8
"Jeg synes da ikke 250 kb er særlig stort" ... hvad er så et stort billede i websammenhæng?
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