Ik heb een script geschreven dat, wanneer een gebruiker een foto/plaatje upload, er direct een thumbnail van wordt gemaakt. Dit wordt gedaan om te zorgen dat dit later niet on-the-fly te hoeven doen aangezien het nogal wat cpu vreet.
Het script werkt prima, de plaatjes worden ook daadwerkelijk geresized en opgeslagen in de correcte map. Dit gaat goed, totdat je daadwerkelijk wat grotere bestanden gaat uploaden, en met grotere bedoel ik dan niet in de bestandsgrootte maar het afbeeldingsformaat.
Wanneer je een plaatje/foto groter dan +/- 1750x2300 probeert te uploaden gaat de upload zelf goed, maar de thumbnail wordt niet gemaakt. De volgende foutmelding verschijnt:
Wanneer het plaatje als BMP wordt opgeslagen neemt het 14,4 Mb in. Wat waarschijnlijk gebeurt is het volgende: php heeft een plaatje ingelezen op hoge kwaliteit (de hele 14,4 Mb), en vervolgens maak ik in mn scriptje een nieuwe image aan om te resizen (vermoedelijk dus nogmaals 14,4 Mb). Dit vermoeden heb ik omdat wanneer de webhoster op mijn verzoek (tijdelijk) de memory limit van een phpscript verhoogde van 20M naar 35M. Het script werkte toen namelijk wel.
Ik heb een poging gedaan het script 'kleiner' te maken door ongebruikte variabelen te unset()-en, maar dit mocht niet helpen. Hieronder het stuk code (het is een flinke lap, waarvoor excuus):
Het script werkt prima, de plaatjes worden ook daadwerkelijk geresized en opgeslagen in de correcte map. Dit gaat goed, totdat je daadwerkelijk wat grotere bestanden gaat uploaden, en met grotere bedoel ik dan niet in de bestandsgrootte maar het afbeeldingsformaat.
Wanneer je een plaatje/foto groter dan +/- 1750x2300 probeert te uploaden gaat de upload zelf goed, maar de thumbnail wordt niet gemaakt. De volgende foutmelding verschijnt:
code:
1
| Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 1944 bytes) in /home/*******/domains/***************/public_html/beta/services/fileService.php on line 72 |
Wanneer het plaatje als BMP wordt opgeslagen neemt het 14,4 Mb in. Wat waarschijnlijk gebeurt is het volgende: php heeft een plaatje ingelezen op hoge kwaliteit (de hele 14,4 Mb), en vervolgens maak ik in mn scriptje een nieuwe image aan om te resizen (vermoedelijk dus nogmaals 14,4 Mb). Dit vermoeden heb ik omdat wanneer de webhoster op mijn verzoek (tijdelijk) de memory limit van een phpscript verhoogde van 20M naar 35M. Het script werkte toen namelijk wel.
Ik heb een poging gedaan het script 'kleiner' te maken door ongebruikte variabelen te unset()-en, maar dit mocht niet helpen. Hieronder het stuk code (het is een flinke lap, waarvoor excuus):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| public function createThumb(FileInfo $source) { $extensionlength = strlen($source->file_extension); //Just in case, but prolly 3. $pathlength = strlen($source->file_path); $path_noext = substr($source->file_path, 0, $pathlength - ($extensionlength +1)); $thumb_pathname = $path_noext . "_thumb.jpg"; //check if width > heigth (ie. image is a rotated photo) if($source->file_img_x > $source->file_img_y) { $target_heigth = ($source->file_img_y * IMG_THUMBX) / $source->file_img_x; $thumb = imagecreatetruecolor(IMG_THUMBX, $target_heigth); $dst_w = IMG_THUMBX; $dst_h = $target_heigth; } else { $target_width = ($source->file_img_x * IMG_THUMBY) / $source->file_img_y; $thumb = imagecreatetruecolor($target_width, IMG_THUMBY); $dst_w = $target_width; $dst_h = IMG_THUMBY; } //er kunnen meerdere bestandstypen komen, dus even checken welke precies switch($source->file_type) { case "image/jpeg": $img = imagecreatefromjpeg($source->file_path); break; case "image/png": $img = imagecreatefrompng($source->file_path); break; case "image/gif": $img = imagecreatefromgif($source->file_path); break; } imagecopyresampled($thumb, $img, 0, 0, 0, 0, $dst_w, $dst_h, $source->file_img_x, $source->file_img_y); imagejpeg($thumb, $thumb_pathname); $theFile = new FileInfo(); $path_parts = pathinfo($thumb_pathname); if($imgInfo = getimagesize($thumb_pathname)) { $type = $imgInfo['mime']; $theFile->file_name = "thumb_". $source->file_name; $theFile->file_extension = $path_parts['extension']; $theFile->file_path = $thumb_pathname; $theFile->file_type = $type; $theFile->file_size = $_FILES['thefile']['size']; $theFile->file_img_x = round($imgInfo[0]); $theFile->file_img_y = round($imgInfo[1]); $theFile->file_thumb = "y"; $theFile->file_thumb_of = $source->file_id; fileService::addFile($theFile); } imagedestroy($thumb); imagedestroy($img); } |
- Mijn vraag is nu vooral, doe ik iets fout, of kan het beter?
[ Voor 1% gewijzigd door MindStorm op 08-08-2006 22:16 . Reden: leesbaarheid vergroten!? ]