imagecreatefromstring - catch失败 - PHP

时间:2014-06-17 23:45:11

标签: php php-gd

我正在尝试在给定URL时检测图像是否是图像。为了保存网址中的图像,我使用了以下内容:

// create the image and save it
$imagefile = $URL;
$resource = imagecreatefromstring(file_get_contents($imagefile));
// X amount of quality is the last number
imagejpeg($resource, "images/covers/$imagepath.jpeg", 50);
imagedestroy($resource);

$ URL只是用户提供的图片链接。

我尝试了以下内容:

$imagefile = $addBuildCover;
$resource = imagecreatefromstring(file_get_contents($imagefile));

if ($resource !== false) {
  $return['imageGood'] = true;  
} else {
  $return['imageBad'] = true;
}

我已尝试过该代码,并且我返回了'imageBad'的正确JSON返回值,但它之前给出了一个错误:

Warning: file_get_contents(ewffw.png): failed to open stream: No such file or directory in /var/www/clients/client2/web3/web/process/addnewbuild.php on line 116

Warning: imagecreatefromstring(): Empty string or invalid image in /var/www/clients/client2/web3/web/process/addnewbuild.php on line 116

如何尝试捕获URL失败但实际上没有像上面那样返回错误?

2 个答案:

答案 0 :(得分:4)

如果您传递无效数据,

imagecreatefromstring将会发出警告,因此使用它会造成不必要的问题。

您必须使用错误抑制运算符@关闭它:

$resource = @imagecreatefromstring(file_get_contents($imagefile));

使用此运算符通常是不受欢迎的,但这种情况是您确实拥有合法用例的情况。

如果无法加载文件,此方法还将处理file_get_contents发出的警告。该功能并没有表​​现得那么糟糕(有方法可以合理确定它是否会失败,例如is_readable)所以你可以用代码检查而不是使用@,但是因为你需要无论如何都要抑制错误,如果文件读取失败,对你没有任何影响,只需在前面拍一个@,恕我直言就可以了。

答案 1 :(得分:-4)

<?php
    $serverName = "server";

    $uid = "user";
    $pwd = "pass";
    $connectionInfo = array( "UID"=>$uid,
                             "PWD"=>$pwd,
                             "Database"=>"database");


    $conn = sqlsrv_connect( $serverName, $connectionInfo);
    if( $conn === false )
    {
         echo "Unable to connect.</br>";
         die( print_r( sqlsrv_errors(), true));
    }


    $fotoquery = "SELECT column_image FROM Table WHERE Column = 'xxxxxxxxxx'";

    $stmt = sqlsrv_query( $conn, $fotoquery);

    if( $stmt === false )
    {
       echo "Error in executing query.</br>";
       die( print_r( sqlsrv_errors(), true));
    }

    $dataImage = sqlsrv_fetch_array($stmt);
    $varimg = base64_encode($dataImage[0]);

    $data = base64_decode($varimg);

    $im = imagecreatefromstring($data);
    if ($im !== false) {
        header('Content-Type: image/png');
        imagepng($im);
        imagedestroy($im);
    }
    else {
        echo 'An error occurred.';
    }
?>