tags:

views:

198

answers:

2

This was working a few moments ago, not sure what changed. error log reads

[08-Aug-2009 02:09:20] PHP Warning:  readfile(/images/32321249694312.JPG) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in /home/public_html/viewimg.php on line 82
[08-Aug-2009 02:09:24] PHP Warning:  Division by zero in /home/public_html/viewimg.php on line 49
[08-Aug-2009 02:09:24] PHP Warning:  readfile(/images/49491249704529.png) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in /home/public_html/viewimg.php on line 82
[08-Aug-2009 02:09:59] PHP Warning:  Division by zero in /home/public_html/viewimg.php on line 49

the code of viewimg.php is below

<?php
header ("Content-type: image/jpeg");
/*
JPEG / PNG Image Resizer
Parameters (passed via URL):

img = path / url of jpeg or png image file

percent = if this is defined, image is resized by it's
          value in percent (i.e. 50 to divide by 50 percent)

w = image width

h = image height

constrain = if this is parameter is passed and w and h are set
            to a size value then the size of the resulting image
            is constrained by whichever dimension is smaller

Requires the PHP GD Extension

Outputs the resulting image in JPEG Format

Filename : imgsize.php
*/

$img = $_GET['img'];
$percent = $_GET['percent'];
$constrain = $_GET['constrain'];
$w = $_GET['w'];
$h = $_GET['h'];

// get image size of img
$x = @getimagesize($img);
// image width
$sw = $x[0];
// image height
$sh = $x[1];

if ($percent > 0) {
    // calculate resized height and width if percent is defined
    $percent = $percent * 0.01;
    $w = $sw * $percent;
    $h = $sh * $percent;
} else {
    if (isset ($w) AND !isset ($h)) {
     // autocompute height if only width is set
     $h = (100 / ($sw / $w)) * .01;
     $h = @round ($sh * $h);
    } elseif (isset ($h) AND !isset ($w)) {
     // autocompute width if only height is set
     $w = (100 / ($sh / $h)) * .01;
     $w = @round ($sw * $w);
    } elseif (isset ($h) AND isset ($w) AND isset ($constrain)) {
     // get the smaller resulting image dimension if both height
     // and width are set and $constrain is also set
     $hx = (100 / ($sw / $w)) * .01;
     $hx = @round ($sh * $hx);

     $wx = (100 / ($sh / $h)) * .01;
     $wx = @round ($sw * $wx);

     if ($hx < $h) {
      $h = (100 / ($sw / $w)) * .01;
      $h = @round ($sh * $h);
     } else {
      $w = (100 / ($sh / $h)) * .01;
      $w = @round ($sw * $w);
     }
    }
}

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image
$im = @ImageCreateFromPNG ($img) or // or PNG Image
$im = @ImageCreateFromGIF ($img) or // or GIF Image
$im = false; // If image is not JPEG, PNG, or GIF

if (!$im) {
    // We get errors from PHP's ImageCreate functions...
    // So let's echo back the contents of the actual image.
    readfile ($img);
} else {
    // Create the resized image destination
    $thumb = @ImageCreateTrueColor ($w, $h);
    // Copy from image source, resize it, and paste to image destination
    @ImageCopyResampled ($thumb, $im, 0, 0, 0, 0, $w, $h, $sw, $sh);
    // Output resized image
    @ImageJPEG ($thumb);
}
?>

NOTE The files in question do exist in the directory. I can access them manually just fine, however when using this script, it fails.

+2  A: 

I think the error message is pretty clear:

readfile(/images/32321249694312.JPG) : failed to open stream: No such file or directory

The image couldn't be opened, for whatever reason. Hence at some point where it's supposed to find out the size of the image, it can't. Thanks to your liberal use of the @ operator this error isn't reported and the variable that is supposed to hold the size of the image is null. This is okay until you try to divide some number by null:

PHP Warning:  Division by zero
deceze
Due to the fact it ~was~ working and then stopped, is there anything in the script that would modify/alter a file that it opens as to prevent access again?
Patrick
You only seem to be using "passive" file reading functions, there should be no problem there. You should lay off of the `@` and use more failure checks, that will help you find where it's going wrong.
deceze
+2  A: 
// get image size of img
$x = getimagesize($img);
if( $x!==FALSE ) {
// continue here
} else {
// getimagesize failed
}
The Disintegrator