[PHP/GD] Script werkt niet op remote server, wel op eigen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Ik heb een simpel script geschreven dat random plaatjes moet kunnen weergeven op een bepaalde grootte, om zo random avatars te kunnen weergeven.

Nou werkt het script dat ik geschreven heb perfect op mijn eigen server (Apache 2.0.48/PHP 4.3.4), maar ik krijg op mijn webserver (Apache 1.3.28/PHP 4.2.3) alleen maar rode kruisen.

Hier de info over GD op beide servers:

Eigen server
GD Support enabled
GD Version bundled (2.0.15 compatible)
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

Webserver
GD Support enabled
GD Version 2.0 or higher
FreeType Support enabled
FreeType Linkage with freetype
JPG Support enabled
PNG Support enabled
WBMP Support enabled

PHP:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php

  define("MAX_IMAGE_SIZE", 96);
  
  $types = array("jpg", "jpeg", "gif", "bmp", "png");
  
  $folder = (isset($_GET["folder"]) ? $_GET["folder"] : ".")."/";
  
  if (isset($_GET["size"]) and is_numeric($_GET["size"]))
    $maxsize = $_GET["size"];
  else
    $maxsize = MAX_IMAGE_SIZE;
  
  if ($handle = opendir($folder)) {
    while (false !== ($file = readdir($handle))) { 
      $filename = explode(".", $file);
      if (in_array($filename[count($filename) - 1], $types))
        $files[] = $file;
    }

    closedir($handle); 
  }

  $image = $files[rand(0, count($files) - 1)];
  
  $width = $height = $maxsize;
  
  $imgInfo = getImageSize($folder.$image);
  
  if (($imgInfo[0] <= $maxsize) and ($imgInfo[1] <= $maxsize)) {
    $width  = $imgInfo[0];
    $height = $imgInfo[1];
    }
    else {
    if ($imgInfo[0] > $imgInfo[1])                      // Width > Height
      $height = round(($imgInfo[1]/$imgInfo[0]) * $maxsize);
    if ($imgInfo[0] < $imgInfo[1])                      // Width < Height
      $width = round(($imgInfo[0]/$imgInfo[1]) * $maxsize);
    }
    
  if ($imgInfo["mime"] != "image/gif") {
    header("Content-type: image/jpeg");
  
    $background = imagecreatetruecolor($width, $height);
    switch ($imgInfo["mime"]) {
        case "image/jpeg": $foreground = imagecreatefromjpeg($folder.$image); break;
        case "image/png":  $foreground = imagecreatefrompng ($folder.$image); break;
        case "image/vnd.wap.wbmp": $foreground = imagecreatefromwbmp ($folder.$image); break;
    }

    imagecopyresized($background, $foreground, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
                                                                       
    imagejpeg($background);
    imagejpeg($foreground);
  
    imagedestroy($background);
    imagedestroy($foreground);
  }
  else {
    header("Content-type: image/gif");
    if ($file = fopen($folder.$image, "rb")) {
      echo fread($file, filesize($folder.$image));
      fclose($file);
    }
  }
  
?>

Ik weet dat zulke grote lappen code niet gebruikelijk zijn, maar ik heb geen duidelijk idee waar de fout zit.
Zelf vermoed ik dat de fout zit in één van de imagecreate functies, maar waarom het precies niet werkt snap ik niet. Doe ik wat verkeerd?

Overigens kun je hier de verschillen tussen beide servers zien:
Lokale server
Webserver
Beide servers bevatten dezelfde afbeeldingen in dezelfde relatieve paden.

Als iemand een idee heeft wat ik verkeerd doe, dan hoor ik het graag. :)

Edit:
Hmm, de gifs werken ook niet goed, dus het ligt niet aan GD lijkt me. Kan het een rechtenkwestie zijn? Ik heb alles 755 gechmod.

[ Voor 7% gewijzigd door NMe op 01-06-2004 23:21 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

Als ik het foute plaatje wget zitten er oa de volgende regels in :

code:
1
2
3
4
5
<b>Warning</b>:  imagecopyresized(): supplied argument is not a valid Image resource in <b>/home/apache/nme.nu/avatar.php</b> on line <b>51</b><br/>

<b>Warning</b>:  imagejpeg(): supplied argument is not a valid Image resource in <b>/home/apache/nme.nu/avatar.php</b>on line <b>54</b><br />

<b>Warning</b>:  imagedestroy(): supplied argument is not a valid Image resource in <b>/home/apache/nme.nu/avatar.php</b> on line <b>57</b><br />


Tijd voor een error_reporting(E_ALL) en even tijdelijk het geheel als text oversturen ipv plaatje, dan kun je de meldingen lezen :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
igmar schreef op 01 juni 2004 @ 23:36:
Als ik het foute plaatje wget zitten er oa de volgende regels in :

[..]

Tijd voor een error_reporting(E_ALL) en even tijdelijk het geheel als text oversturen ipv plaatje, dan kun je de meldingen lezen :)
OMG, dat ik dat vergeten ben... :X Doe ik anders altijd... :X

Blijkbaar bestaat de index "mime" niet in PHP < 4.3:
Beginning with PHP 4.3, getimagesize() also returns an additional parameter, mime, that corresponds with the MIME type of the image.
Nouja, dan ga ik maar ff uitzoeken hoe ik dan aan het mimetype kom, moet geen probleem zijn. Tnx voor de hulp bij zo'n basic fout. :X

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

hmmz heb je wel gdlib ondersteuning op je webserver?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Verwijderd schreef op 01 juni 2004 @ 23:41:
hmmz heb je wel gdlib ondersteuning op je webserver?
Ja, zoals ik ook in mijn startpost al zei. :P Bovendien weet ik al wat het probleem is. Ik kan alleen geen manier vinden om in PHP < 4.3.0 een image- of mimetype op te halen... :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 01 juni 2004 @ 23:56:
[...]

Ja, zoals ik ook in mijn startpost al zei. :P Bovendien weet ik al wat het probleem is. Ik kan alleen geen manier vinden om in PHP < 4.3.0 een image- of mimetype op te halen... :?
Hmmz met me slaperige kop niet gezien.

het mime typen kan je alleen ophalen bij het uploaden via een form met

$_FILES['bestand']['type']
- dit is het mime type van de het bestand

Als je het van een plaatje wilt bepalen
Returns an array with 4 elements. Index 0 contains the width of the image in pixels. Index 1 contains the height. Index 2 is a flag indicating the type of the image: 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM. These values correspond to the IMAGETYPE constants that were added in PHP 4.3. Index 3 is a text string with the correct height="yyy" width="xxx" string that can be used directly in an IMG tag. Voorbeeld 1. getimagesize (file)

code:
1
2
3
<?php
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo "[img]\"img/flag.jpg\"[/img]";

?>
http://nl3.php.net/manual/nl/function.getimagesize.php

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Verwijderd schreef op 02 juni 2004 @ 00:58:
[...]


Hmmz met me slaperige kop niet gezien.

het mime typen kan je alleen ophalen bij het uploaden via een form met

$_FILES['bestand']['type']
- dit is het mime type van de het bestand
Ik gebruik de $_FILES array nergens, die is hier niet toe te passen.
Zoals ik in een eerdere post al zei werkt dat niet in een eerdere versie van PHP dan 4.3 en de webserver draait 4.2.3, dus dat lukt niet. :/

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Mime:
image/jpeg
image/gif
image/png
image/xbmp
Kun je aan de hand van de extensie wel automagisch koppelen. Misschien is je php op je server gecompileerd met --enable-mime-magic of --with-mime-magic en kun je mime_content_type gebruiken.

Dit is misschien ook wel interessant

[ Voor 18% gewijzigd door Skaah op 02-06-2004 08:58 ]


Acties:
  • 0 Henk 'm!

  • MarkvE
  • Registratie: Maart 2004
  • Laatst online: 30-01 17:16
Idd, mime_content_type zou moeten werken (PHP 4.0 >= 4.3, PHP 5).

[ Voor 4% gewijzigd door MarkvE op 02-06-2004 09:19 ]

Vormkracht10


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Tnx voor de tip, het werkte niet met alleen die functie, omdat die ook pas vanaf PHP 4.3 ondersteund wordt, maar in de comments stond hoe ik het mimetype via een shell command kon krijgen. Nadeel daarvan is dat het in Windows niet meer werkte, maar dat heb ik ook opgevangen. Bij deze mijn volledige, werkende script, volledig patent-free :+ :
PHP:
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
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
<?php

  error_reporting(E_ALL);
  
  define("MAX_IMAGE_SIZE", 96);
  
  if (!function_exists("mime_content_type")) {
    function mime_content_type($file) {
      return exec("file -bi ".escapeshellcmd($file));
    }
  }

  $types = array("jpg", "jpeg", "gif", "bmp", "png");
  
  $folder = (isset($_GET["folder"]) ? $_GET["folder"] : ".")."/";
  
  if (isset($_GET["size"]) and is_numeric($_GET["size"]))
    $maxsize = $_GET["size"];
  else
    $maxsize = MAX_IMAGE_SIZE;
  
  if ($handle = opendir($folder)) {
    while (false !== ($file = readdir($handle))) { 
      $filename = explode(".", $file);
      if (in_array($filename[count($filename) - 1], $types))
        $files[] = $file;
    }

    closedir($handle); 
  }

  $image = $files[rand(0, count($files) - 1)];
  
  $width = $height = $maxsize;
  
  $imgInfo = getImageSize($folder.$image);
  $mimeType = mime_content_type(realpath($folder.$image));
  if (empty($mimeType))
    $mimeType = $imgInfo["mime"];
  
  if (($imgInfo[0] <= $maxsize) and ($imgInfo[1] <= $maxsize)) {
    $width  = $imgInfo[0];
    $height = $imgInfo[1];
    }
    else {
      if ($imgInfo[0] > $imgInfo[1])                      // Width > Height
        $height = round(($imgInfo[1]/$imgInfo[0]) * $maxsize);
      if ($imgInfo[0] < $imgInfo[1])                      // Width < Height
        $width = round(($imgInfo[0]/$imgInfo[1]) * $maxsize);
    }
    
  if ($mimeType != "image/gif") {
    header("Content-type: image/jpeg");
  
    $background = imagecreatetruecolor($width, $height);
    switch ($mimeType) {
      case "image/jpeg": $foreground = imagecreatefromjpeg($folder.$image); break;
      case "image/png":  $foreground = imagecreatefrompng ($folder.$image); break;
      case "image/vnd.wap.wbmp": $foreground = imagecreatefromwbmp ($folder.$image); break;
    }

    imagecopyresampled($background, $foreground, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
                                                                       
    imagejpeg($background);
    imagejpeg($foreground);
  
    imagedestroy($background);
    imagedestroy($foreground);
  }
  else {
    header("Content-type: image/gif");
    if ($file = fopen($folder.$image, "rb")) {
      echo fread($file, filesize($folder.$image));
      fclose($file);
    }
  }

?>

[ Voor 28% gewijzigd door NMe op 02-06-2004 12:38 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1