Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как проверить на существование удаленного файла
 
 автор: OLi   (13.12.2012 в 00:34)   письмо автору
 
 

Сейчас используется такая бесполезная проверка:

function HaveFile($file){

$file = fopen ($file, "r");
if (!$file) {
    return false;
}
return true;
}


C выводом такой ошибки, если файл не существует:
Warning: fopen(http://site.com/images/anno/big3_1355327154.JPG) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/g/garmonia/site.com/public_html/parsing/cars/index.php on line 198

  Ответить  
 
 автор: Igorek   (13.12.2012 в 11:38)   письмо автору
 
   для: OLi   (13.12.2012 в 00:34)
 

<?php
function remote_file_exists($url)
{
    
stream_context_set_default(array('http' => array('method' => 'HEAD')));
    return (bool) 
preg_match('~HTTP/1\.\d\s+200\s+OK~', @end(array_intersect_key(get_headers($url1), range(03))));
}


$file 'http://windows.php.net/downloads/releases/php-5.3.19-Win32-VC9-x86.msi';
var_dump(remote_file_exists($file));


можно попробовать такой код (с учетом редиректов работает). Сильно не тестил, но похоже, что все в норме.

<?php 
end
(array_intersect_key(get_headers($url1), range(03)))

это получение значения (статус ответа) последнего целочисленного ключа массива заголовков

  Ответить  
 
 автор: OLi   (13.12.2012 в 14:49)   письмо автору
 
   для: Igorek   (13.12.2012 в 11:38)
 

Fatal error: Call to undefined function stream_context_set_default() in Z:\home\test1.ru\www\check\index.php on line 4

  Ответить  
 
 автор: Lotanaen   (13.12.2012 в 15:04)   письмо автору
 
   для: OLi   (13.12.2012 в 14:49)
 

.....

  Ответить  
 
 автор: Igorek   (13.12.2012 в 15:08)   письмо автору
 
   для: OLi   (13.12.2012 в 14:49)
 

мда... забыл упомянуть, что требуется php >= 5.3.0
можно и без этой функции, только в этом случае будет выполняться GET запрос.
Честно говоря не знаю, означает ли это, что в данном случае сервер будет загружать сам файлик или все же возьмет только заголовки. Может кто подскажет? ))

  Ответить  
 
 автор: Sfinks   (13.12.2012 в 16:07)   письмо автору
 
   для: Igorek   (13.12.2012 в 15:08)
 

Чтобы загрузить только заголовки, нужно загружать либо через curl с опциями returntransfer и nobody, либо через сокеты, по запросу HEAD вместо GET.

  Ответить  
 
 автор: OLi   (13.12.2012 в 16:59)   письмо автору
 
   для: Sfinks   (13.12.2012 в 16:07)
 

Можно пример?

  Ответить  
 
 автор: OLi   (13.12.2012 в 19:30)   письмо автору
 
   для: OLi   (13.12.2012 в 16:59)
 

Сделал так:
<?

$file 
'http://windows.php.net/downloads/releases/php-5.3.19-Win32-VC9-x86.msi'

$ch curl_init($file);

curl_setopt($chCURLOPT_NOBODYtrue);
curl_exec($ch);
$retcode curl_getinfo($chCURLINFO_HTTP_CODE);
// $retcode > 400 -> not found, $retcode = 200, found.
echo $retcode;
curl_close($ch);

?>

  Ответить  
 
 автор: OLi   (13.12.2012 в 19:53)   письмо автору
 
   для: OLi   (13.12.2012 в 19:30)
 

а можно узнать через curl тип вернувшегося содержимого? скажем сделать проверку вернул ли сервер картинку?

  Ответить  
 
 автор: Sfinks   (13.12.2012 в 21:41)   письмо автору
 
   для: OLi   (13.12.2012 в 19:53)
 

$file = 'http://windows.php.net/downloads/releases/php-5.3.19-Win32-VC9-x86.msi';  
$ch = curl_init($file); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
$s = curl_exec($ch);

$s будет содержать заголовки ответа сервера.
Заголовок Content-Type - тип содержимого

  Ответить  
 
 автор: OLi   (14.12.2012 в 17:06)   письмо автору
 
   для: Sfinks   (13.12.2012 в 21:41)
 

Что-то не работает..возвращает строку URL только

  Ответить  
 
 автор: Sfinks   (14.12.2012 в 19:47)   письмо автору
 
   для: OLi   (14.12.2012 в 17:06)
 

Да, забыл, еще нужно добавить
curl_setopt($ch, CURLOPT_HEADER, true);

  Ответить  
 
 автор: Igorek   (13.12.2012 в 19:57)   письмо автору
 
   для: Sfinks   (13.12.2012 в 16:07)
 

ну вот я про тоже. используя
<?php
stream_context_set_default
(array('http' => array('method' => 'HEAD'))); 

можно было бы избежать операций с curl или сокетами, но это для php >= 5.3.0

  Ответить  
 
 автор: OLi   (13.12.2012 в 20:14)   письмо автору
 
   для: Igorek   (13.12.2012 в 19:57)
 

А для CURL узнать, что это изображение?

  Ответить  
 
 автор: OLi   (16.12.2012 в 00:38)   письмо автору
 
   для: OLi   (13.12.2012 в 20:14)
 

В общем нужна ваша подсказка:
Сделал так:


    
 <?
  $ch 
curl_init();
  
curl_setopt ($chCURLOPT_RETURNTRANSFER1);
  
curl_setopt ($chCURLOPT_URL$image_url);
  
curl_setopt ($chCURLOPT_CONNECTTIMEOUT20);
  
curl_setopt ($chCURLOPT_USERAGENT$_SERVER['HTTP_USER_AGENT']);
  
curl_setopt ($chCURLOPT_FOLLOWLOCATIONtrue);
  
curl_setopt($chCURLOPT_HEADERtrue); 
  
curl_setopt($chCURLOPT_NOBODYtrue);

  
$content curl_exec ($ch);
  
$contentType curl_getinfo($chCURLINFO_CONTENT_TYPE);
  
    
    
// $retcode > 400 -> not found, $retcode = 200, found. 
    
if ($retcode == 404 && $contentType =='text/html') {
    
        
curl_close($ch);

        return 
false;
    } else {
        
        
curl_close($ch);
        return 
true;} 
     

}
?>


 <?    if (HaveFile($row['image_tmp']) == true ) {
        
        if (
file_put_contents('images/'.$name.'_'.$row['listid'].'.'.getExtension4($row['image_tmp']), file_get_contents($row['image_tmp']))) {

                
$db mysql_query('UPDATE images set status=1, fname = "'.$name.'_'.$row['listid'].'.'.getExtension4($row['image_tmp']).'" WHERE listid="'.$row['listid'].'"');
    
                
LoadIMage();
        }
    } 
?>


Сейчас возникает ошибка:
Warning: file_get_contents(http://autohmao.ru/images/anno/big2_1355500315.JPG) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/g/garmonia/site.com/public_html/parsing/cars/index.php on line 241

Как можно отловить такого рода ошибки, чтобы скрипт прошел дальше на исполнение?

  Ответить  
 
 автор: Igorek   (17.12.2012 в 07:51)   письмо автору
 
   для: OLi   (16.12.2012 в 00:38)
 

Это не ошибка, а предупреждение, т.е. работа скрипта не должна прекращаться. А само предупреждение можно "подавить" используя собаку

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования