2011-10-07 16 views
27

Necesito comprobar si existe un archivo en particular en un servidor remoto. El uso de is_file() y file_exists() no funciona. ¿Alguna idea de cómo hacer esto de forma rápida y fácil?Cómo comprobar si existe un archivo desde una url

+0

por qué no trabajar ??? – JellyBelly

+3

Puede usar esta función getimagesize ("url"); . Ref: http://php.net/manual/en/function.getimagesize.php – InventorX

Respuesta

49

que tienen que utilizar CURL

function is_url_exist($url){ 
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

    if($code == 200){ 
     $status = true; 
    }else{ 
     $status = false; 
    } 
    curl_close($ch); 
    return $status; 
} 
+1

funciona bien tiene una línea de error tipográfico 1 función debe ser función –

+0

No necesita CURL para eso ... demasiada sobrecarga ... revisa mi respuesta a continuación (¡usa los get_headers de PHP para esto!) – patrick

+1

como los demás, tampoco revisa si es un archivo o no, simplemente revisa la URL. 'echo is_url_exists ('http://stackoverflow.com')? 'Sí': 'No'; 'echo' Sí '. –

1

Realice una solicitud con curl y verifique si devuelve un código de estado 404. Realice la solicitud utilizando el método de solicitud HEAD para que solo devuelva los encabezados sin un cuerpo.

13

Acabo de encontrar esta solución:

if(@getimagesize($remoteImageURL)){ 
    //image exists! 
}else{ 
    //image does not exist. 
} 

Fuente: http://www.dreamincode.net/forums/topic/11197-checking-if-file-exists-on-remote-server/

+0

¿Querías 'getimagesize'? Como aquí: http://uk1.php.net/getimagesize si es así, los documentos dicen que puede hacer referencia a archivos locales o remotos. – Todd

+0

Sí, corregido. ¡Gracias! –

+2

getimagesize es demasiada sobrecarga. Si solo quieres saber si existe un archivo usa el get_header de PHP (verifica mi respuesta) – patrick

45

que no es necesario para que RIZO ... Demasiado mucha sobrecarga por solo querer comprobar si existe un archivo o no ...

Uso PHP's get_header.

$headers=get_headers($url); 

A continuación, comprobar si $ resultado [0] contiene 200 OK (lo que significa que el archivo está allí)

Una función para comprobar si funciona una URL podría ser la siguiente:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 

/* You can test a URL like this (sample) */ 
if(UR_exists("http://www.amazingjokes.com/")) 
    echo "This page exists"; 
else 
    echo "This page does not exist"; 
+1

' Por defecto, get_headers usa una solicitud GET para buscar los encabezados', así que en lugar del sobrecarga de una solicitud curl (no estoy seguro de a qué sobrecarga se refiere) - hay una solicitud GET derrochadora que deja el cuerpo en lugar de usar una solicitud HEAD y solo recibir los encabezados. – AD7six

+1

@ AD7six: Asumí que configurar cURL en memoria causaría sobrecarga, hice algunas pruebas comparando los dos métodos y tiene razón: si tiene cargada la biblioteca cURL, es más rápido usar el método aceptado en comparación con get_headers. Comparé los 3 métodos mencionados: cURL es el más rápido, luego get_headers, luego getimagesize con la desventaja añadida getimagesize solo le dirá si existe una imagen. Es lo que se pidió, por lo que sigue siendo una respuesta válida aquí, pero no es muy versátil. – patrick

+1

@ ad7six ¿estás seguro de que get_headers está solicitando el cuerpo? fyi, puede anular la solicitud GET a través del contexto del flujo: stream_context_set_default (['http' => ['method' => 'HEAD']]); $ headers = get_headers ('http://example.com'); – Tobias

3

Hola según nuestra prueba entre 2 servidores diferentes, los resultados son los siguientes:

usando curl para verificar 10 archivos .png (cada uno de aproximadamente 5 mb) fue en promedio 5,7 segundos. usando un control de encabezado para la misma cosa ¡tomó un promedio de 7.8 segundos!

¡De modo que en nuestro curl de prueba fue mucho más rápido si tiene que verificar archivos más grandes!

nuestra función rizo es:

function remote_file_exists($url){ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if($httpCode == 200){return true;} 
    return false; 
} 

aquí es nuestra cabecera muestra de verificación:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 
Cuestiones relacionadas