[PHP] Foto-script werkt soms wel, soms niet.

Pagina: 1
Acties:
  • 3.483 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • geert1
  • Registratie: Maart 2006
  • Laatst online: 20-09 21:08
Bij het ontwikkelen van een website voor lokaal nieuws (112Marum.nl) heb ik een vreemd probleem ondervonden, waar ik geen verklaring voor heb. Ik ben geen expert, dus het zou iets simpels kunnen zijn. Ik hoop dat dit topic ook als naslag voor anderen kan dienen, en dus niet direct verwijderd wordt.

Het probleem is als volgt: De website heeft een beheersysteem, waar de beheerder nieuwsberichten met foto's kan toevoegen, wijzigen en verwijderen. Een foto-script zorgt ervoor dat maximaal 10 foto's per bericht worden ge-upload, verkleind naar het juiste formaat, en voorzien worden van een watermerk. Dit alles met enkele PHP-functies. Dit script werkte in principe prima bij het testen, maar er doet zich nu een vaag probleem voor: Het werkt soms wel, en soms niet. Wanneer er iets fout gaat, zijn foutmeldingen te zien zoals deze:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/img_5686.jpg' is not a valid JPEG file

Dit terwijl alle bestanden wél JPG-bestanden zijn, die vers van de digitale camera komen. De foto's zijn ongeveer 1 tot 3 megapixel groot, en dus ongeveer 500kb maximaal. Vaak werkt het bij een tweede poging wél! Ook nadat de foto's handmatig zijn verkleind naar een lagere resolutie, werkt het script vlekkeloos, maar dit is nu juist wat het script zelf zou moeten doen. Het kan dus te maken hebben met de hoeveelheid data die per upload verzonden wordt, of misschien met het feit dat de foto's onbewerkt van een camera afkomen (dat php die bestanden niet pikt). Het kan ook zijn dat de server vol is, maar dit lijkt me onwaarschijnlijk. Is er een makkelijke manier om dit te controleren?

Ik heb geen directe toegang tot de server. De PHP versie is 4.4.7 (phpinfo)

Alle hulp is welkom. Als er meer uitleg nodig is, dan geef ik dat graag.

Hier de relevante broncode. Dit deel is niet door mij geschreven, en volgens mij is het niet de meest moderne of correcte code:


PHP: bericht_toevoegen.php
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/****************    Configuratie    *****************/  

$file_mimes    = array('image/jpeg','image/jpg','image/gif','image/bmp');        // Toegestane bestand Mime Types. Voeg zonodig meer mime types toe. 
$file_exts    = array('.jpg','.JPG','.gif');                    // Toegestane bestand extensies. Voeg zonodig meer mime-types toe. 
$upload_dir    ="/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/";                        // Map waar alle uploads opgeslagen worden. (eindigend op "/") 
$aantal_u    = "10";                            // Aantal mogelijke uploads per keer 
$up_empty    = "";                        // Boodschap bij leeg uploadveld. 
$up_finish    = "Gelukt";                        // Boodschap bij Geslaagde upload. 
$up_fail    = "<p>Er is een fout opgetreden bij het toevoegen van de foto('s). Mogelijke oorzaken:<BR>- Foto is niet van het bestandstype Jpg/Jpeg<BR>- Foto is groter dan 2 Mb</p>";  // Boodschap bij mislukte upload. 
$up_perm    = "Veranderen van de permissies naar 777 is mislukt";    // Boodschap bij mislukken van veranderen permissies 
$url_dir    = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);  
$url_this    = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];  
$upload_url    = $url_dir."/".$upload_dir."/";  
$nu = time();

if($aantal_u <11)  
{  

/**********   Begin Controle En Upload   **************/  

    for($x = 0; $x < $aantal_u; $x++)  
    {  
     $upfile = 'upfile_'.$x;  
     
     $file_name = $_FILES[$upfile]['name'];  
     
     $file_type = $_FILES[$upfile]['type'];  
     $file_ext = strtolower(substr($file_name,strrpos($file_name,".")));  

     //echo "<b>Upload ".($x+1).":</b> ";  
   
     if ($file_name != "" && $file_type != "")  
     {   
        if (!in_array($file_type, $file_mimes) && !in_array($file_ext, $file_exts))  
        {  
         echo $up_fail."\n";  
        }  
    
        else  
        {  
          $temp_name = $_FILES[$upfile]['tmp_name'];  
          $file_name = $_FILES[$upfile]['name'];   
          $file_name = str_replace("\\","",$file_name);  
          $file_name = str_replace("'","",$file_name);  
          $file_name = str_replace("%","_",$file_name);
          $file_name = str_replace("&","_",$file_name);
          $file_name = str_replace(";","",$file_name);
          $file_name = str_replace("%20","_",$file_name);
          $file_name = str_replace(" ","_",$file_name);
          $file_name = strtolower($file_name);
          //echo $filename;
          $file_path = $upload_dir.$file_name;  
          //echo"pad = $file_path <BR>";
          $result  =  move_uploaded_file($temp_name, $file_path); 
          //einde uploadscript
          
          //start resize-script TJ
          define("SOURCE_DIR", $upload_dir);
          define("TARGET_DIR", $upload_dir);
          $formaat = getimagesize(SOURCE_DIR.$file_name);
          $fl_h = $formaat[0];
          //Hoogte bepaald
          $fl_w = $formaat[1];
          //Breedte bepaald
        
        if ($fl_h > $fl_w) {
          list($md_f, $md_w, $md_h) = resize($fl_w, $fl_h, 480); 
          //Formaat MD bepaald
        }
        else {
          list($md_f, $md_w, $md_h) = resize($fl_w, $fl_h, 360); 
          //Formaat MD bepaald
        }
  
         $src_img = imagecreatefromjpeg(SOURCE_DIR.$file_name); 
        //Afbeelding ingelezen

         $dest_img = imagecreatetruecolor($md_h,$md_w); 
        //Doel aangemaakt

         imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $md_h, $md_w, $fl_h, $fl_w);
        //Afbeelding geschaald
        
        $watermerk = imagecreatefrompng("uploads/watermerk.png");
        $watermerk_width = imagesx($watermerk);
        $watermerk_height = imagesy($watermerk);
        imagecreatetruecolor($watermerk_width, $watermerk_height);
        
        // positie voor watermerk bepalen
        $xas = $md_h - $watermerk_width;
        $yas = $md_w - $watermerk_height;

        //--- overschrijf het 'geuploade bestand' en voeg watermerk toe
        imagecopymerge($dest_img, $watermerk, $xas, $yas, 0, 0, $watermerk_width, $watermerk_height, 100);
        

        $newfile = $file_name;
        $newfile = $nu.$newfile;
        imagejpeg($dest_img, TARGET_DIR.$newfile); 
        //Afbeelding opgeslagen
        
         chmod(TARGET_DIR.$newfile, 0664);
         //chmod(TARGET_DIR."md_".$newfile, 0664); 
        //Rechten goedgezet

         imagedestroy($src_img); 
        //Geheugen geleegd 

        imagedestroy($dest_img);
        //Geheugen geleegd
        
        imagedestroy($watermerk);
        //Geheugen geleegd

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Gooi bovenin je script eens een
PHP:
1
ini_set('ERROR_REPORTING', 'E_ALL');


getimagesize hoort namelijk al een error te geven (voor jou PHP versie een E_NOTICE error). Waarschijnlijk gaat het mis bij het uploaden en ga je over de max_filesize danwel max_execute_time. Deze kun je met een beetje geluk aanpassen danwel omzeilen door het uploaden en bewerken los van elkaar te laten plaatsvinden :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • geert1
  • Registratie: Maart 2006
  • Laatst online: 20-09 21:08
Bedankt voor de reactie. Helaas heb ik hier zelf nog geen goede manier om het probleem na te bootsen, het gebeurt op de pc van de beheerder. De foutmeldingen zijn naar mij toegemaild zodat ik het kon proberen op te lossen.

De foutmeldingen herhalen zich 10 keer, omdat er een for-loop is voor de tien foto's. Het ziet er ongeveer zo uit:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/img_5686.jpg' is not a valid JPEG file in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 128

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 134

Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 152

Warning: imagedestroy(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 159
En dat dus keer tien. Een tweede mailtje die ik van de eigenaar kreeg bevatte:
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpetx3gy' to '/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/img_5686.jpg' in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 107

Warning: getimagesize() [function.getimagesize]: Read error! in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 113

Warning: Division by zero in /hsphere/local/home/rnotenbo/112marum.nl/functions.php on line 135

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 128

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/img_5686.jpg' is not a valid JPEG file in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 128

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 131

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 134

Warning: imagecopymerge(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 147

Warning: imagejpeg(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 152

Warning: chmod() [function.chmod]: No such file or directory in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 155

Warning: imagedestroy(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 159

Warning: imagedestroy(): supplied argument is not a valid Image resource in /hsphere/local/home/rnotenbo/112marum.nl/cms/bericht_toevoegen.php on line 162
Het ziet er dus inderdaad zo uit dat het te maken heeft met de max_file_size en/of de max_execute_time. Ik heb de max_file_size via een hidden inputveld op 5.000.000 gezet, maar ik vermoed dat er ook server-side instellingen zijn die hierover gaan? Het is inderdaad zo dat het uploaden vrij lang duurt, misschien wel langer dan de server toestaat.

Ik heb geen vrije toegang tot de server-instellingen, maar de hosting-eigenaar is wel erg behulpzaam. Dus als ik zou weten wat ik aan de server moet aanpassen, dan kan ik dat zeker aan de hosting-provider vragen.

Alle hulp is welkom, bvd!

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

not a valid JPEG
Toch duidelijk niet?
1: ofwel bestaat die foto gewoonweg niet
2: ofwel is de foto echt beschadigd.

Los dat op, en al de rest wordt opgelost.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Snake, het is zelfs nog duidelijker:
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpetx3gy' to '/hsphere/local/home/rnotenbo/112marum.nl/cms/uploads/img_5686.jpg'
Hier gaat het mis: de foto kan niet uit de temp locatie gehaald worden. Dit betekend dat de foto in zijn geheel niet goed geupload is, reden daarvoor is zoals gezegd waarschijnlijk een te grote filesize.

Als je 10 foto's van elk 500kb upload zit je in totaal op 5 meg, zou net goed moeten gaan (PHP hanteert standaard 8Mb in totaal, 2Mb per file meen ik voor fileuploads) maar wellicht staan je instellingen anders dan normaal.

Dit moet je inderdaad serverside aanpassen (clientside gaat niet werken met een input veld ;)), dit kun je, mits je rechten hebt, doen door ini_set() aan te roepen met de configuratie optie die je wilt veranderen.

Je wilt dan waarschijnlijk iets als dit bovenaan je script zetten:
PHP:
1
2
3
ini_set('max_execution_time', 60);
ini_set('post_max_size', '16M');
ini_set('upload_max_filesize', '4M');


Weet zo uit m'n hoofd niet of je die allemaal runtime kan veranderen, anders moet je de beheerder vragen deze settings in z'n php.ini aan te passen of indien mogelijk aanpassen in een .htaccess file:
code:
1
2
3
php_value max_execution_time 60
php_value post_max_size 16000000
php_value upload_max_filesize 4000000

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • geert1
  • Registratie: Maart 2006
  • Laatst online: 20-09 21:08
Heel erg bedankt voor de uitleg FragFrog! Na enig zoekwerk vond ik op een pagina van PHP.net dat deze aanpassingen waarschijnlijk niet allemaal met ini_set kunnen worden uitgevoerd, dus ik geef het door aan de server-eigenaar. Ik hoop dat het probleem hiermee is opgelost. Ik plaats hier de voortgang wel even als ik meer weet.

En @Snake hierboven:
Bedankt voor je reactie, maar als het zo simpel was, dan had ik het zelf nog wel gevonden. De gebruikte bestanden zijn allemaal werkende JPG's die prima te openen zijn in editors en viewers.

[ Voor 21% gewijzigd door geert1 op 15-08-2007 20:37 ]

Pagina: 1