我有以下代码将图像上传到外部服务器。问题是,它只上传阵列中的一个图像,而不是阵列中的所有图像,问题在哪里:)?
$images = explode(',', $details['images']);
$mh = curl_multi_init();
$sequenceNumber = 1;
foreach ($images as $i => $url) {
if (file_exists(dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg')) {
$uploadfile = dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg';
} else {
copy($url, dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg');
$uploadfile = dirname(dirname(__FILE__)) . '/tmp/' . $delad . '_' . $sequenceNumber . '.jpg';
}
$conn[$i] = curl_init("http://*/image.html");
curl_setopt($conn[$i], CURLOPT_POSTFIELDS, array(
'sequenceNumber' => $sequenceNumber,
'imageData' => "@" . $uploadfile . ";type=image/png",
'filename' => $url
));
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($conn[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_multi_add_handle($mh, $conn[$i]);
$sequenceNumber++;
}
do { $n=curl_multi_exec($mh,$active); } while ($active);
foreach ($images as $i => $url) {
//$res[$i]=curl_multi_getcontent($conn[$i]);
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
$details[‘images’]只是一个用逗号分隔的图像url列表,例如
http://google.com/stackoverflow-logo.png,http://google.com/stackoverflow2.png
在对原始问题的评论中,原始海报表示他们无法控制设置的接收端,但当他们在foreach
循环中进行一次卷曲时,图像会被上传。
如果是这样的话,也许接收方根本无法同时处理太多的请求。因此,我建议在脚本中添加一个sleep()
设置,以便在上传之间暂停,让接收方有机会赶上。
因此,在第一个foreach()
循环的最底部:
curl_multi_add_handle($mh, $conn[$i]);
$sequenceNumber++;
}
添加sleep()
命令,如下所示:
curl_multi_add_handle($mh, $conn[$i]);
$sequenceNumber++;
sleep(10);
}
由于sleep()
使用秒,我已将其设置为10秒。请随时根据您的脚本结果进行调整;应用程序需求。