ver validar una servidor readable que imagen existe directorio crear comprobar check borrar archivo php file networking testing

una - php validar archivo



¿Cómo se puede verificar si existe un archivo remoto usando PHP? (19)

Como dice Pies, puedes usar cURL. Puedes obtener cURL para que solo te dé los encabezados, y no el cuerpo, lo que puede hacer que sea más rápido. Un mal dominio siempre puede demorar un tiempo porque esperará la solicitud de tiempo de espera; probablemente puedas cambiar la duración del tiempo de espera usando cURL.

Aquí hay un ejemplo:

function remoteFileExists($url) { $curl = curl_init($url); //don''t fetch the actual page, you only want to check the connection is ok curl_setopt($curl, CURLOPT_NOBODY, true); //do request $result = curl_exec($curl); $ret = false; //if request did not fail if ($result !== false) { //if request was ok, check response code $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($statusCode == 200) { $ret = true; } } curl_close($curl); return $ret; } $exists = remoteFileExists(''http://stackoverflow.com/favicon.ico''); if ($exists) { echo ''file exists''; } else { echo ''file does not exist''; }

Lo mejor que pude encontrar, una fclose tipo fclose fopen , hace que la página cargue muy despacio.

Básicamente, lo que trato de hacer es lo siguiente: tengo una lista de sitios web y quiero mostrar sus favicons junto a ellos. Sin embargo, si un sitio no tiene uno, me gustaría reemplazarlo con otra imagen en lugar de mostrar una imagen rota.


Debe emitir solicitudes HEAD, no OBTENER una, porque no necesita el contenido URI en absoluto. Como dice Pies arriba, debe verificar el código de estado (en rangos de 200-299, y opcionalmente puede seguir los redireccionamientos 3xx).

La pregunta de respuestas contiene muchos ejemplos de código que pueden ser útiles: PHP / Curl: la solicitud HEAD tarda mucho tiempo en algunos sitios.


Esta no es una respuesta a su pregunta original, sino una mejor manera de hacer lo que está tratando de hacer:

En lugar de tratar de obtener directamente el favicon del sitio (que es un daño real dado que podría ser /favicon.png, /favicon.ico, /favicon.gif, o incluso /path/to/favicon.png), use google:

<img src="http://www.google.com/s2/favicons?domain=[domain]">

Hecho.


Esto funciona para que compruebe si existe un archivo remoto en PHP:

$url = ''https://cdn.sstatic.net/Sites//img/favicon.ico''; $header_response = get_headers($url, 1); if ( strpos( $header_response[0], "404" ) !== false ) { echo ''File does NOT exist''; } else { echo ''File exists''; }


Esto se puede hacer obteniendo el código de estado HTTP (404 = no encontrado) que es posible con file_get_contentsDocs haciendo uso de las opciones de contexto. El siguiente código tiene en cuenta los redireccionamientos y devolverá el código de estado del destino final ( Demo ):

$url = ''http://example.com/''; $code = FALSE; $options[''http''] = array( ''method'' => "HEAD", ''ignore_errors'' => 1 ); $body = file_get_contents($url, NULL, stream_context_create($options)); foreach($http_response_header as $header) sscanf($header, ''HTTP/%*d.%*d %d'', $code); echo "Status code: $code";

Si no quiere seguir los redireccionamientos, puede hacerlo de manera similar ( Demo ):

$url = ''http://example.com/''; $code = FALSE; $options[''http''] = array( ''method'' => "HEAD", ''ignore_errors'' => 1, ''max_redirects'' => 0 ); $body = file_get_contents($url, NULL, stream_context_create($options)); sscanf($http_response_header[0], ''HTTP/%*d.%*d %d'', $code); echo "Status code: $code";

Algunas de las funciones, opciones y variables en uso se explican con más detalle en una publicación de blog que he escrito: HEAD primero con PHP Streams .


Hay una alternativa aún más sofisticada. Puede hacer la comprobación de todo el lado del cliente utilizando un truco JQuery.

$(''a[href^="http://"]'').filter(function(){ return this.hostname && this.hostname !== location.hostname; }).each(function() { var link = jQuery(this); var faviconURL = link.attr(''href'').replace(/^(http:////[^//]+).*$/, ''$1'')+''/favicon.ico''; var faviconIMG = jQuery(''<img src="favicon.png" alt="" />'')[''appendTo''](link); var extImg = new Image(); extImg.src = faviconURL; if (extImg.complete) faviconIMG.attr(''src'', faviconURL); else extImg.onload = function() { faviconIMG.attr(''src'', faviconURL); }; });

De http://snipplr.com/view/18782/add-a-favicon-near-external-links-with-jquery/ (el blog original está actualmente abajo)


La solución de CoolGoose es buena, pero es más rápida para archivos grandes (ya que solo intenta leer 1 byte):

if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) { $image = $default_image; }


No sé si este es más rápido cuando el archivo no existe de forma remota, is_file() , pero podría is_file() .

$favIcon = ''default FavIcon''; if(is_file($remotePath)) { $favIcon = file_get_contents($remotePath); }


Para comprobar la existencia de imágenes, se debe preferir getimagesize sobre getimagesize , ya que es mucho más rápido.

Para suprimir el E_NOTICE , simplemente anteponga el operador de control de errores ( @ ).

if (@exif_imagetype($filename)) { // Image exist }

Como IMAGETYPE_XXX adicional, con el valor devuelto ( IMAGETYPE_XXX ) de exif_imagetype también podríamos obtener el tipo mime o la extensión de archivo con image_type_to_mime_type / image_type_to_extension .


Puede indicar a curl que use el método HTTP HEAD a través de CURLOPT_NOBODY.

Más o menos

$ch = curl_init("http://www.example.com/favicon.ico"); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // $retcode >= 400 -> not found, $retcode = 200, found. curl_close($ch);

De todos modos, solo guarda el costo de la transferencia HTTP, no el establecimiento y cierre de la conexión TCP. Y al ser pequeños favicons, es posible que no veas mucha mejoría.

El almacenamiento en caché del resultado localmente parece una buena idea si resulta ser demasiado lento. HEAD comprueba el tiempo del archivo y lo devuelve en los encabezados. Puede hacer como navegadores y obtener el CURLINFO_FILETIME del icono. En su caché puede almacenar la URL => [favicon, timestamp]. A continuación, puede comparar la marca de tiempo y volver a cargar el favicon.


Puede usar lo siguiente:

$file = ''http://mysite.co.za/images/favicon.ico''; $file_exists = (@fopen($file, "r")) ? true : false;

Trabajé para mí cuando trato de verificar si existe una imagen en la URL


Puedes usar :

$url=getimagesize(“http://www.flickr.com/photos/27505599@N07/2564389539/”); if(!is_array($url)) { $default_image =”…/directoryFolder/junal.jpg”; }


Si está tratando con imágenes, use getimagesize. A diferencia de file_exists, esta función incorporada es compatible con archivos remotos. Devolverá una matriz que contiene la información de la imagen (ancho, alto, tipo, etc.). Todo lo que tienes que hacer es verificar el primer elemento de la matriz (el ancho). use print_r para dar salida al contenido de la matriz

$imageArray = getimagesize("http://www.example.com/image.jpg"); if($imageArray[0]) { echo "it''s an image and here is the image''s info<br>"; print_r($imageArray); } else { echo "invalid image"; }


Una función completa de la respuesta más votada:

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;} }

Puedes usarlo así:

if(remote_file_exists($url)) { //file exists, do something }


Una solución radical sería mostrar los favicons como imágenes de fondo en un div encima de su icono predeterminado. De esta forma, toda la sobrecarga se colocaría en el cliente sin mostrar imágenes rotas (las imágenes de fondo faltantes se ignoran en todos los navegadores AFAIK).


todas las respuestas aquí que usan get_headers () están haciendo una solicitud GET. Es mucho más rápido / más barato simplemente hacer una solicitud HEAD.

Para asegurarse de que get_headers () haga una solicitud HEAD en lugar de un GET, debe agregar esto:

stream_context_set_default( array( ''http'' => array( ''method'' => ''HEAD'' ) ) );

para verificar si existe un archivo, su código se vería así:

stream_context_set_default( array( ''http'' => array( ''method'' => ''HEAD'' ) ) ); $headers = get_headers(''http://website.com/dir/file.jpg'', 1); $file_found = stristr($headers[0], ''200'');

$ file_found devolverá falso o verdadero, obviamente.


Es posible que las funciones incorporadas de PHP no funcionen para verificar la URL si la configuración allow_url_fopen está desactivada por razones de seguridad. Curl es una mejor opción ya que no necesitaríamos cambiar nuestro código en una etapa posterior. A continuación se muestra el código que utilicé para verificar una URL válida:

$url = str_replace('' '', ''%20'', $url); $ch = curl_init($url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($httpcode>=200 && $httpcode<300){ return true; } else { return false; }

Tenga en cuenta la opción CURLOPT_SSL_VERIFYPEER , que también verifica que las URL comiencen con HTTPS.


function remote_file_exists($url){ return(bool)preg_match(''~HTTP/1/./d/s+200/s+OK~'', @current(get_headers($url))); } $ff = "http://www.emeditor.com/pub/emed32_11.0.5.exe"; if(remote_file_exists($ff)){ echo "file exist!"; } else{ echo "file not exist!!!"; }


if (false === file_get_contents("http://example.com/path/to/image")) { $image = $default_image; }

Deberia trabajar ;)