This is a discussion on PHP-gen'd images won't display in HTML within the alt.comp.lang.php forums, part of the PHP Programming Forums category; I have an image-generating script myimage.php that's worked and that I've used for years. All it ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
I have an image-generating script myimage.php that's worked and that I've
used for years. All it does is increment a counter file and output a single pixel in the color I provide. But on one particular web server I uploaded to, the behavior is strange. If I enter the URL http://www.domain.ext/myimage.php, the picture is displayed as expected. But if I insert the script into HTML, like <img src="myimage.php">, it fails to display and I get the broken image icon, instead. This has never happened before, but I do not know enough about PHP builds and web server settings to figure this out. Any suggestions? Thanks for any help! Here's the code, if necessary: $filename = trim($_GET['filename']); $color = (trim($_GET['color']) == "") ? "000000" : trim($_GET['color']); $count = '0'; $file_last_mod = 0; // Set up filename whether or not provided if(strlen($filename)) { $filename .= ".count"; } else { $fname_end = strrpos($script_name, "."); $fname_end = ($fname_end === false) ? strlen($script_name) : $fname_end - 1; $slash_pos = strrpos($script_name, "/"); $fname_start = ($slash_pos === false) ? 0 : $slash_pos + 1; $script_name = (!strlen($filename)) ? $HTTP_SERVER_VARS['SCRIPT_NAME'] : $filename; $filename = substr($script_name, $fname_start, $fname_end - $slash_pos) .. ".count"; } // open and read file if it exists if (file_exists($filename)) { $file_last_mod = filemtime($filename); $count = file_get_contents($filename); } // increment count $count += 1; // reopen file and write new count $handle = fopen($filename, "w"); fwrite($handle, $count); fclose($handle); // Generate a 1 x 1 pixel image $im = @imagecreate(1, 1) or die("<!-- Cannot Initialize new GD image stream -->"); // Set up color if not provided if (!strlen(trim($color))) $color = "000000"; // Set image color $red = 0 + base_convert(substr($color, 0, 2), 16, 8); $green = 0 + base_convert(substr($color, 2, 2), 16, 8); $blue = 0 + base_convert(substr($color, 4, 2), 16, 8); $img_color = imagecolorallocate($im, $red, $green, $blue); // Output the created image according to available GD image support if (function_exists("imagegif")) { header("Content-type: image/gif"); imagegif($im); } elseif (function_exists("imagejpeg")) { header("Content-type: image/jpeg"); imagejpeg($im); } elseif (function_exists("imagepng")) { header("Content-type: image/png"); imagepng($im); } elseif (function_exists("imagewbmp")) { header("Content-type: image/vnd.wap.wbmp"); imagewbmp($im); } else { die("<!-- No image support on this PHP server -->"); } |
|
|||
|
I tried your script and it works on my localhost. If you tried
http://www.domain.ext/myimage.php and it worked then we know the image module is working. So all i can think of is 1) The path to the image has a problem. 2) The file outputs some unwanted characters. Check that there is no blank spaces at the top of the page or anywhere else that get output. Try setting error_reporting(0) so that no warnings are output. |
|
|||
|
I also had this problem, I can;t remember exactly how i solved it, but i
remember that you CAN'T set the image-source to a .php file. If i now more, i'l let you know. "CPD" <no@spam.pls> schreef in bericht news:POudnZ4ec9eNgwnYnZ2dnUVZ_t2tnZ2d@comcast.com. .. >I have an image-generating script myimage.php that's worked and that I've >used for years. All it does is increment a counter file and output a single >pixel in the color I provide. But on one particular web server I uploaded >to, the behavior is strange. > > If I enter the URL http://www.domain.ext/myimage.php, the picture is > displayed as expected. But if I insert the script into HTML, like <img > src="myimage.php">, it fails to display and I get the broken image icon, > instead. > > This has never happened before, but I do not know enough about PHP builds > and web server settings to figure this out. > > Any suggestions? Thanks for any help! > > > > Here's the code, if necessary: > > $filename = trim($_GET['filename']); > $color = (trim($_GET['color']) == "") ? "000000" : trim($_GET['color']); > > $count = '0'; > $file_last_mod = 0; > > // Set up filename whether or not provided > > if(strlen($filename)) { > $filename .= ".count"; > } > else { > $fname_end = strrpos($script_name, "."); > $fname_end = ($fname_end === false) ? strlen($script_name) : > $fname_end - 1; > $slash_pos = strrpos($script_name, "/"); > $fname_start = ($slash_pos === false) ? 0 : $slash_pos + 1; > $script_name = (!strlen($filename)) ? $HTTP_SERVER_VARS['SCRIPT_NAME'] > : $filename; > $filename = substr($script_name, $fname_start, $fname_end - $slash_pos) > . ".count"; > } > > // open and read file if it exists > > if (file_exists($filename)) { > $file_last_mod = filemtime($filename); > $count = file_get_contents($filename); > } > > // increment count > > $count += 1; > > // reopen file and write new count > > $handle = fopen($filename, "w"); > fwrite($handle, $count); > fclose($handle); > > // Generate a 1 x 1 pixel image > > $im = @imagecreate(1, 1) > or die("<!-- Cannot Initialize new GD image stream -->"); > > // Set up color if not provided > > if (!strlen(trim($color))) $color = "000000"; > > // Set image color > > $red = 0 + base_convert(substr($color, 0, 2), 16, 8); > $green = 0 + base_convert(substr($color, 2, 2), 16, 8); > $blue = 0 + base_convert(substr($color, 4, 2), 16, 8); > $img_color = imagecolorallocate($im, $red, $green, $blue); > > // Output the created image according to available GD image support > > if (function_exists("imagegif")) { > header("Content-type: image/gif"); > imagegif($im); > } elseif (function_exists("imagejpeg")) { > header("Content-type: image/jpeg"); > imagejpeg($im); > } elseif (function_exists("imagepng")) { > header("Content-type: image/png"); > imagepng($im); > } elseif (function_exists("imagewbmp")) { > header("Content-type: image/vnd.wap.wbmp"); > imagewbmp($im); > } else { > die("<!-- No image support on this PHP server -->"); > } > |
|
|||
|
Might be the http header
CPD wrote: > I have an image-generating script myimage.php that's worked and that I've > used for years. All it does is increment a counter file and output a single > pixel in the color I provide. But on one particular web server I uploaded > to, the behavior is strange. > > If I enter the URL http://www.domain.ext/myimage.php, the picture is > displayed as expected. But if I insert the script into HTML, like <img > src="myimage.php">, it fails to display and I get the broken image icon, > instead. > > This has never happened before, but I do not know enough about PHP builds > and web server settings to figure this out. > > Any suggestions? Thanks for any help! > > > > Here's the code, if necessary: > > $filename = trim($_GET['filename']); > $color = (trim($_GET['color']) == "") ? "000000" : trim($_GET['color']); > > $count = '0'; > $file_last_mod = 0; > > // Set up filename whether or not provided > > if(strlen($filename)) { > $filename .= ".count"; > } > else { > $fname_end = strrpos($script_name, "."); > $fname_end = ($fname_end === false) ? strlen($script_name) : > $fname_end - 1; > $slash_pos = strrpos($script_name, "/"); > $fname_start = ($slash_pos === false) ? 0 : $slash_pos + 1; > $script_name = (!strlen($filename)) ? $HTTP_SERVER_VARS['SCRIPT_NAME'] : > $filename; > $filename = substr($script_name, $fname_start, $fname_end - $slash_pos) > .. ".count"; > } > > // open and read file if it exists > > if (file_exists($filename)) { > $file_last_mod = filemtime($filename); > $count = file_get_contents($filename); > } > > // increment count > > $count += 1; > > // reopen file and write new count > > $handle = fopen($filename, "w"); > fwrite($handle, $count); > fclose($handle); > > // Generate a 1 x 1 pixel image > > $im = @imagecreate(1, 1) > or die("<!-- Cannot Initialize new GD image stream -->"); > > // Set up color if not provided > > if (!strlen(trim($color))) $color = "000000"; > > // Set image color > > $red = 0 + base_convert(substr($color, 0, 2), 16, 8); > $green = 0 + base_convert(substr($color, 2, 2), 16, 8); > $blue = 0 + base_convert(substr($color, 4, 2), 16, 8); > $img_color = imagecolorallocate($im, $red, $green, $blue); > > // Output the created image according to available GD image support > > if (function_exists("imagegif")) { > header("Content-type: image/gif"); > imagegif($im); > } elseif (function_exists("imagejpeg")) { > header("Content-type: image/jpeg"); > imagejpeg($im); > } elseif (function_exists("imagepng")) { > header("Content-type: image/png"); > imagepng($im); > } elseif (function_exists("imagewbmp")) { > header("Content-type: image/vnd.wap.wbmp"); > imagewbmp($im); > } else { > die("<!-- No image support on this PHP server -->"); > } > > |
|
|||
|
..oO(Webtechnics - Info)
>I also had this problem, I can;t remember exactly how i solved it, but i >remember that you CAN'T set the image-source to a .php file. That's wrong. The value of the 'src' attribute is a URL, and a URL just points to a resource somewhere on a network. It doesn't matter if the referenced resource is a static file and delivered as-is or if it is generated by a script. A ".php" in a URL is absolutely meaningless. Micha |
|
|||
|
CPD schrieb:
> I have an image-generating script myimage.php that's worked and that I've > used for years. All it does is increment a counter file and output a single > pixel in the color I provide. But on one particular web server I uploaded > to, the behavior is strange. > > If I enter the URL http://www.domain.ext/myimage.php, the picture is > displayed as expected. But if I insert the script into HTML, like <img > src="myimage.php">, it fails to display and I get the broken image icon, > instead. > > This has never happened before, but I do not know enough about PHP builds > and web server settings to figure this out. > > Any suggestions? Thanks for any help! > > > > Here's the code, if necessary: > > $filename = trim($_GET['filename']); > $color = (trim($_GET['color']) == "") ? "000000" : trim($_GET['color']); > > $count = '0'; > $file_last_mod = 0; > > // Set up filename whether or not provided > > if(strlen($filename)) { > $filename .= ".count"; > } > else { > $fname_end = strrpos($script_name, "."); > $fname_end = ($fname_end === false) ? strlen($script_name) : > $fname_end - 1; > $slash_pos = strrpos($script_name, "/"); > $fname_start = ($slash_pos === false) ? 0 : $slash_pos + 1; > $script_name = (!strlen($filename)) ? $HTTP_SERVER_VARS['SCRIPT_NAME'] : > $filename; > $filename = substr($script_name, $fname_start, $fname_end - $slash_pos) > . ".count"; > } > > // open and read file if it exists > > if (file_exists($filename)) { > $file_last_mod = filemtime($filename); > $count = file_get_contents($filename); > } > > // increment count > > $count += 1; > > // reopen file and write new count > > $handle = fopen($filename, "w"); > fwrite($handle, $count); > fclose($handle); > > // Generate a 1 x 1 pixel image > > $im = @imagecreate(1, 1) > or die("<!-- Cannot Initialize new GD image stream -->"); > > // Set up color if not provided > > if (!strlen(trim($color))) $color = "000000"; > > // Set image color > > $red = 0 + base_convert(substr($color, 0, 2), 16, 8); > $green = 0 + base_convert(substr($color, 2, 2), 16, 8); > $blue = 0 + base_convert(substr($color, 4, 2), 16, 8); > $img_color = imagecolorallocate($im, $red, $green, $blue); > > // Output the created image according to available GD image support > > if (function_exists("imagegif")) { > header("Content-type: image/gif"); > imagegif($im); > } elseif (function_exists("imagejpeg")) { > header("Content-type: image/jpeg"); > imagejpeg($im); > } elseif (function_exists("imagepng")) { > header("Content-type: image/png"); > imagepng($im); > } elseif (function_exists("imagewbmp")) { > header("Content-type: image/vnd.wap.wbmp"); > imagewbmp($im); > } else { > die("<!-- No image support on this PHP server -->"); > } > > |
|
|||
|
Folks, thanks for all the good tips and discussion. It got my brain
cranking, and it turned out to be a permissions issue. Always took for granted that perms 446 was sufficient, but somehow on this server, it had to be 447. Not sure why because the counter file is only read from and written to, but it works now! Thanks again, and have a Happy New Year! "CPD" <no@spam.pls> wrote in message news:POudnZ4ec9eNgwnYnZ2dnUVZ_t2tnZ2d@comcast.com. .. >I have an image-generating script myimage.php that's worked and that I've >used for years. All it does is increment a counter file and output a single >pixel in the color I provide. But on one particular web server I uploaded >to, the behavior is strange. > > If I enter the URL http://www.domain.ext/myimage.php, the picture is > displayed as expected. But if I insert the script into HTML, like <img > src="myimage.php">, it fails to display and I get the broken image icon, > instead. > > This has never happened before, but I do not know enough about PHP builds > and web server settings to figure this out. > > Any suggestions? Thanks for any help! > > > > Here's the code, if necessary: > > $filename = trim($_GET['filename']); > $color = (trim($_GET['color']) == "") ? "000000" : trim($_GET['color']); > > $count = '0'; > $file_last_mod = 0; > > // Set up filename whether or not provided > > if(strlen($filename)) { > $filename .= ".count"; > } > else { > $fname_end = strrpos($script_name, "."); > $fname_end = ($fname_end === false) ? strlen($script_name) : > $fname_end - 1; > $slash_pos = strrpos($script_name, "/"); > $fname_start = ($slash_pos === false) ? 0 : $slash_pos + 1; > $script_name = (!strlen($filename)) ? $HTTP_SERVER_VARS['SCRIPT_NAME'] > : $filename; > $filename = substr($script_name, $fname_start, $fname_end - $slash_pos) > . ".count"; > } > > // open and read file if it exists > > if (file_exists($filename)) { > $file_last_mod = filemtime($filename); > $count = file_get_contents($filename); > } > > // increment count > > $count += 1; > > // reopen file and write new count > > $handle = fopen($filename, "w"); > fwrite($handle, $count); > fclose($handle); > > // Generate a 1 x 1 pixel image > > $im = @imagecreate(1, 1) > or die("<!-- Cannot Initialize new GD image stream -->"); > > // Set up color if not provided > > if (!strlen(trim($color))) $color = "000000"; > > // Set image color > > $red = 0 + base_convert(substr($color, 0, 2), 16, 8); > $green = 0 + base_convert(substr($color, 2, 2), 16, 8); > $blue = 0 + base_convert(substr($color, 4, 2), 16, 8); > $img_color = imagecolorallocate($im, $red, $green, $blue); > > // Output the created image according to available GD image support > > if (function_exists("imagegif")) { > header("Content-type: image/gif"); > imagegif($im); > } elseif (function_exists("imagejpeg")) { > header("Content-type: image/jpeg"); > imagejpeg($im); > } elseif (function_exists("imagepng")) { > header("Content-type: image/png"); > imagepng($im); > } elseif (function_exists("imagewbmp")) { > header("Content-type: image/vnd.wap.wbmp"); > imagewbmp($im); > } else { > die("<!-- No image support on this PHP server -->"); > } > |
|
|||
|
Webtechnics - Info wrote:
> I also had this problem, I can;t remember exactly how i solved it, but i > remember that you CAN'T set the image-source to a .php file. > > If i now more, i'l let you know. > > > Yea, that simply isn't correct. I use .php files to send images with no problem. The PHP script simply needs to generate the correct header before it writes any data. For a JPEG, you'd include a line like this in your script: header ('Content-Type: image/jpeg'); If your script is called foo.php, you can load the image like this: <img src="foo.php" alt="A dynamic image." /> The browser will use the header rather than the extension to determine the file type. PHP can pass any type of data to the browser using this method. One application I wrote passes Word, Excel, PDF, HTML, JPEG, GIF, and PNG files through the same wrapper script, and could pass anything that has a mime type by placing the correct mime type into the database. PHP can output just about anything to a web browser. |