Я использую функцию внутри класса PHP для чтения изображений из массива URL-адресов и записи их на локальном компьютере.
Что-то вроде ниже:
function ImageUpload($urls)
{
$image_urls = explode(',', $urls);
foreach ($image_urls as $url)
{
$url = trim($url);
$img_name = //something
$source = file_get_contents($url);
$handle = fopen($img_name, "w");
fwrite($handle, $source);
fclose($handle);
}
}
Он успешно читает и пишет 1 или 2 изображения, но поднимает 500 Internal severs
для чтения второго или третьего изображения. В файле журнала Apache нет ничего важного. Также я заменяю команду file_get_contents
следующими операторами cURL, но результат такой же (кажется, cURL
читает еще одно изображение, чем file_get_contents
).
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,500);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
$source = curl_exec($ch);
curl_close($ch);
unset($ch);
Также проблема заключается только в чтении с URL-адресов http, и если у меня есть изображения где-то локально, нет никаких проблем для их чтения и записи.
Я внес некоторые изменения в ваш код, надеюсь, что это поможет :)
$opts = array(
'http' => array(
'method'=>"GET",
'header'=>"Content-Type: text/html; charset=utf-8"
)
);
$context = stream_context_create($opts);
$image_urls = explode(',', $urls);
foreach ($image_urls as $url) {
$result = file_get_contents(trim($url),TRUE,$context);
if($result === FALSE) {
print "Error with this URL : " . $url . "<br />";
continue;
}
$handle = fopen($img_name, "a+");
fwrite($handle, $result);
fclose($handle);
}
Я не вижу обработчика для чтения в цикле, ваш $handle = fopen($img_name, "w");
просто для записи, вам также нужно $handle = fopen($img_name, "r");
для чтения ! потому что вы не можете прочитать handle (fread()
) для fopen($img_name, "w");
,
Дополнительный ответ:
Могли бы вы изменить (и посмотреть, работает ли он):
.........
$img_name = //something
$context = stream_context_create($image_urls );
$source= file_get_contents( $url ,false,$context);
.....
.....