我需要在服务器上本地下载一堆图片链接。大多数请求工作正常,但是当作业运行预定的夜晚时,它会返回黑色图像。检查源并给出正确的图像。
很少它也会返回黑色图像,左上角的实际图片非常小。
该数组包含大约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);
}
}
答案 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);
}
}
}