有时循环调整图像大小 return 不完整或黑色图像
Image resizing in loop sometimes return incomplete or black images
我有一堆图片链接需要在服务器本地下载。大多数请求工作正常,但有时当作业在预定的夜间运行时,它 returns 黑色图像。已检查来源并提供正确的图像。
很少它也 returns 黑色图像,左上角有实际图片,但非常小。
该数组包含大约 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);
}
}
您确定您使用的是 CURLOPT_TIMEOUT 而不是 CURLOPT_TIMEOUT_MS 吗?
28800 秒超时似乎很高。
如果您在其他地方将 CURLOPT_TIMEOUT_MS 设置为较低的值,则采用最低值。
当下载文件的时间超过您的超时时间时,您会得到一个不完整的文件...
downloadFile 似乎承担了一切 'just works'。生活和编程不是这样的。
以下是我预计可能会出现错误并在发生时采取措施的一些区域。如果需要,您可以通过其他方式执行此操作,例如使用 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);
}
}
}
我有一堆图片链接需要在服务器本地下载。大多数请求工作正常,但有时当作业在预定的夜间运行时,它 returns 黑色图像。已检查来源并提供正确的图像。
很少它也 returns 黑色图像,左上角有实际图片,但非常小。
该数组包含大约 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);
}
}
您确定您使用的是 CURLOPT_TIMEOUT 而不是 CURLOPT_TIMEOUT_MS 吗?
28800 秒超时似乎很高。 如果您在其他地方将 CURLOPT_TIMEOUT_MS 设置为较低的值,则采用最低值。
当下载文件的时间超过您的超时时间时,您会得到一个不完整的文件...
downloadFile 似乎承担了一切 'just works'。生活和编程不是这样的。
以下是我预计可能会出现错误并在发生时采取措施的一些区域。如果需要,您可以通过其他方式执行此操作,例如使用 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);
}
}
}