-1

我有一个调整图像大小的功能,虽然它在我的测试服务器上运行良好,但它在新的实时服务器上不起作用。我得到的错误信息是

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

下面代码中的第 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
}
4

1 回答 1

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'ed 的用户下)ls -l以确认权限

于 2013-06-18T20:21:57.060 回答