Проверьте, существует ли изображение на удаленном сервере перед загрузкой - PullRequest
4 голосов
/ 06 мая 2011

Я пытаюсь загрузить изображения с удаленного сервера, изменить размер и затем сохранить его на локальном компьютере.

Для этого я использую WideImage.

<?php 

include_once($_SERVER['DOCUMENT_ROOT'].'libraries/wideimage/index.php');

include_once($_SERVER['DOCUMENT_ROOT'].'query.php');    


do { 


wideImage::load($row_getImages['remote'])->resize(360, 206, 'outside')->saveToFile($_SERVER['DOCUMENT_ROOT'].$row_getImages['local']);}

while ($row_getImages = mysql_fetch_assoc($getImages)); 


?>

Это работает большую часть времени. Но у него есть роковой недостаток.

Если по какой-либо причине одно из этих изображений недоступно или не существует. Wideimage бросает роковую ошибку. Предотвращение загрузки любых других изображений, которые могут существовать.

Я пытался проверить, существует ли файл, подобный этому

    do { 

if(file_exists($row_getImages['remote'])){

    wideImage::load($row_getImages['remote'])->resize(360, 206, 'outside')->saveToFile($_SERVER['DOCUMENT_ROOT'].$row_getImages['local']);}

}        
    while ($row_getImages = mysql_fetch_assoc($getImages)); 

Но это не работает.

Что я делаю не так ??

Спасибо

Ответы [ 3 ]

5 голосов
/ 06 мая 2011

Согласно этой странице file_exists не может проверять наличие удаленных файлов. В комментариях кто-то предложил использовать fopen в качестве обходного пути:

<?php
function fileExists($path){
    return (@fopen($path,"r")==true);
}
?>
0 голосов
/ 03 августа 2016

После некоторых копаний в сети я решил запросить заголовки HTTP вместо запроса CURL, так как, очевидно, это меньше затрат.

Это адаптация комментария Ника с форумов PHP по адресу: http://php.net/manual/en/function.get-headers.php

function get_http_response_code($theURL) {
   $headers = get_headers($theURL);
   return substr($headers[0], 9, 3);
}
$URL = htmlspecialchars($postURL);
$statusCode = intval(get_http_response_code($URL));

if($statusCode == 200) { // 200 = ok
    echo '<img src="'.htmlspecialchars($URL).'" alt="Image: '.htmlspecialchars($URL).'" />';
} else {
    echo '<img src="/Img/noPhoto.jpg" alt="This remote image link is broken" />';
}

Ник называет эту функцию "быстрым и неприятным решением", хотя она хорошо работает для меня: -)

0 голосов
/ 06 мая 2011

Вы можете проверить через CURL:

$curl = curl_init('http://example.com/my_image.jpg');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_NOBODY, TRUE);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if($httpcode < 400) {
  // do stuff
}
...