旧的PHP GD代码不再有效

时间:2013-06-02 17:57:00

标签: php gd

我有一个调整图像大小的功能,虽然它在我的测试服务器上工作正常,但它不适用于新的实时服务器。我得到的错误信息是

警告:imagejpeg():无法打开'/home/sites/public_html/images/2013-24-1-240x300.jpg'进行写入:/ home / sites / public_html / includes /中没有此类文件或目录第352行的functions / html_output.php

下面代码中的第352行是靠近底部的imagejpeg行。如果它动态创建图像,我不明白为什么它试图打开文件。

图像文件夹是可写的(更改为777以进行检查),因为原始图像显示正常。在捆绑的实时服务器上启用GD(2.0.34兼容)

现在两台服务器上的PHP和GD版本都相同。唯一的区别是测试服务器正在运行WAMP而live是一个linux。

function image_resample($src,$width,$height) {

    define(JPEGQUALITY, 75);
    define(ALLOWSQUASH,0.10);
    if ($src=='') {
            return $src;
     }
    $i = @getimagesize( $src );   // 1-gif (ignore), 2-jpeg, 3-png

    if (!(($width == SMALL_IMAGE_WIDTH) && ($height == SMALL_IMAGE_HEIGHT)) && 
        !(($width == MEDIUM_IMAGE_WIDTH) && ($height == MEDIUM_IMAGE_HEIGHT))&&  
        !(($width == LARGE_IMAGE_WIDTH) && ($height == LARGE_IMAGE_HEIGHT)))  {
            return $src; // can amend to work with other images
     }
    if (!( ($i[2] == 3) || ($i[2] ==2))) {
            return $src;
     }

    $file = preg_replace( '/\.([a-z]{3,4})$/i', "-{$width}x{$height}.\\1", $src );   // name of resampled image
    if (is_file( $file ) ) {        
            return $file;
    }

    $scr_w         =  $i[0];
    $scr_h         = $i[1];
    if (($scr_w * $scr_h * $width * $height) == 0) {
            return $src;
     }

    $howsquashed = ($width / $height * $scr_h / $scr_w);
    if (((1 / (1 + ALLOWSQUASH)) < $howsquashed) && ($howsquashed < (1 + ALLOWSQUASH))) $simpleway='true';
    $scalefactor = min($width/$scr_w, $height/$scr_h);          
    $scaled_w        = (int)($scr_w * $scalefactor);
    $scaled_h         = (int)($scr_h * $scalefactor); 
    $offset_w        = max(0,round(($width - $scaled_w) / 2,0));
    $offset_h         = max(0,round(($height - $scaled_h) / 2)); 
     $dst = DIR_FS_CATALOG . '/' . $file; 
       $dstim = @imagecreatetruecolor ($width, $height);
    $background_color = imagecolorallocate ($dstim, 255, 255, 255);
    imagefilledrectangle($dstim, 0, 0, $width, $height, $background_color);
    if ( $i[2] == 2) {
            $srcim = @ImageCreateFromJPEG ($src); // open
    }
    elseif ( $i[2] == 3) {
            $srcim         = @ImageCreateFromPNG ($src);
    }
    if ($simpleway == 'true') {        
            imagecopyresampled ($dstim, $srcim, 0, 0, 0, 0, $width, $height, $scr_w, $scr_h);        
    }
    else {
            $intim = @imagecreatetruecolor ($width, $height); 
            imagecopyresampled ($intim, $srcim, $offset_w, $offset_h, 0, 0, $scaled_w, $scaled_h, $scr_w, $scr_h);
            imagecopy ( $dstim, $intim, $offset_w, $offset_h, $offset_w, $offset_h, $scaled_w, $scaled_h);
            imagedestroy ($intim);
    }
    if ( $i[2] == 2) {
            imagejpeg ($dstim , $dst , JPEGQUALITY);  
    }
    elseif ( $i[2] == 3) {
            imagepng ($dstim , $dst);
    }
    imagedestroy ($srcim);
    imagedestroy ($dstim);
    return $file;                 // Use the newly resampled image
}

1 个答案:

答案 0 :(得分:1)

消息很清楚

Warning: imagejpeg(): Unable to open ' /home/sites/public_html/images/2013-24-1-240x300.jpg'
 for writing: No such file or directory in 
/home/sites/public_html/includes/functions/html_output.php on line 352

如果目录存在chmod,那么apache用户可以写入它。

如果目录不存在则创建它然后chmod它(644应该就够了)

如果文件已经存在 - 它无法覆盖它,那么chmod该文件(可能你用SCP将它转移到它所用的SCP用户下面)ls -l来确认权限< / p>