在循环中调整图像大小有时会返回不完整或黑色图像

时间:2015-10-27 08:14:45

标签: php curl image-resizing

我需要在服务器上本地下载一堆图片链接。大多数请求工作正常,但是当作业运行预定的夜晚时,它会返回黑色图像。检查源并给出正确的图像。

很少它也会返回黑色图像,左上角的实际图片非常小。

该数组包含大约150张要获取和调整大小的图像。

首先,我下载文件:

function downloadFile($url, $path) {
    $file = basename($url);
    $source = file_get_contents($url);
    $fp = fopen($path. $file, 'w');
    set_time_limit(0);
    $options = array(
      CURLOPT_FILE    => $fp,
      CURLOPT_TIMEOUT =>  28800, 
      CURLOPT_URL     => $fp,
    );

    $ch = curl_init();
    curl_setopt_array($ch, $options);
    curl_exec($ch);


    fwrite($fp, $source);

    fclose($fp);
    curl_close($ch);

}

然后调整大小:

   function Img_Resize($path) {

       $x = getimagesize($path);            
       $width  = $x['0'];
       $height = $x['1'];

       $rs_width  = 245;//resize to half of the original width.
       $rs_height = 163;//resize to half of the original height.

       switch ($x['mime']) {
          case "image/gif":
             $img = imagecreatefromgif($path);
             break;
          case "image/jpeg":
             $img = imagecreatefromjpeg($path);
             break;
          case "image/jpg":
             $img = imagecreatefromjpeg($path);
             break;
          case "image/png":
             $img = imagecreatefrompng($path);
             break;
       }

       $img_base = imagecreatetruecolor($rs_width, $rs_height);
       imagesetinterpolation($img_base, IMG_BICUBIC);
       imagecopyresampled($img_base, $img, 0, 0, 0, 0, $rs_width, $rs_height, $width, $height);

       $path_info = pathinfo($path);    
       switch ($path_info['extension']) {
          case "gif":
             imagegif($img_base, $path);  
             break;
          case "jpeg":
             imagejpeg($img_base, $path);  
             break;
          case "jpg":
             imagejpeg($img_base, $path);  
             break;
          case "png":
             imagepng($img_base, $path);  
             break;
       }

    }

如下:

foreach ($URLimages as &$value) {
    if (strpos($value->image, '.jpg')) {
    downloadFile($value->image, $path);
    $test = basename($value->image);
    $img = Img_Resize($path . $test);
    }
}

2 个答案:

答案 0 :(得分:0)

您确定使用的是CURLOPT_TIMEOUT而不是CURLOPT_TIMEOUT_MS吗?

28800秒超时似乎非常高。 如果您将CURLOPT_TIMEOUT_MS设置在较低值的其他位置,则会采用最低值。

当下载文件的时间超过你的超时时,你会得到一个不完整的文件......

答案 1 :(得分:0)

downloadFile似乎假设一切正常运作'。生活和编程并非如此。

以下是我可能会遇到错误的一些方面,如果发生错误就会做一些事情。如果需要,您可以通过其他方式执行此操作,例如使用try...catch并抛出异常。

$source = file_get_contents($url);
if (!$source) { // failed - retry or take other action
    return false;
}

$fp = fopen($path. $file, 'w');
if (!$fp) { // file didn't open ...
    return false;
}

$ch = curl_init();
if (!$ch) { // curl session didn't start ...
    return false;
}

if (!curl_exec( $ch)) { // curl session didn't work
    return false;
}

if (!fwrite($fp, $source)) { // data didn't get written to file
    return false;
}


// return success
return true;
}

您的主代码不应尝试为下载失败生成图像:

foreach ($URLimages as &$value) {
  if (strpos($value->image, '.jpg')) {
    if (downloadFile($value->image, $path)) {
      $test = basename($value->image);
      $img = Img_Resize($path . $test);
    }
  }
}