¿Cómo verifico si el archivo existe en jQuery o JavaScript puro?

Respuestas:

433

Con jQuery:

$.ajax({
    url:'http://www.example.com/somefile.ext',
    type:'HEAD',
    error: function()
    {
        //file not exists
    },
    success: function()
    {
        //file exists
    }
});

EDITAR:

Aquí está el código para verificar el estado 404, sin usar jQuery

function UrlExists(url)
{
    var http = new XMLHttpRequest();
    http.open('HEAD', url, false);
    http.send();
    return http.status!=404;
}

Pequeños cambios y podría verificar el estado del código de estado HTTP 200 (éxito), en su lugar.

EDITAR 2: dado que la sincronización XMLHttpRequest está en desuso, puede agregar un método de utilidad como este para hacerlo asíncrono:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
cichy
fuente
55
en su ejemplo de javascript puro, debería ser un OnReadyStateChangeevento vinculante antes de verificar HTTP_STATUS.
RobertPitt
8
El código de ejemplo es incorrecto y no se dice nada sobre lo que está sucediendo en el servidor. La pregunta original es bastante vaga, pero no hay razón para suponer que el servidor que se está ejecutando allí, de hecho, está asignando URL directamente al sistema de archivos. Honestamente, no veo por qué esta respuesta es tan popular, ya que en realidad no dice cómo hacer lo que pidió la pregunta.
Puntiagudo
75
@Pointy Podría ser porque resuelve algo que el resto de nosotros buscamos en Google
Ian Hunter
44
@cichy: ¿esto carga el archivo en la memoria o no? Estoy buscando verificar la existencia pero no cargar un archivo.
Brian
11
XMLHttpRequest síncrono en el subproceso principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final. Para obtener más ayuda, xhr.spec.whatwg.org (esta advertencia del navegador)
kupendra,
71

Un enfoque similar y más actualizado.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Matthew James Davis
fuente
2
¿Por qué está esto más actualizado? $.ajaxparece mejor si es más compatible con versiones anteriores, ¿verdad?
tim peterson
15
$ .ajax también funciona, pero las funciones de éxito / error / completar están en desuso a favor de las promesas, los métodos hecho / fallar / siempre. Lea más sobre esto aquí api.jquery.com/jQuery.ajax . Solía ​​llegar aquí porque solo estamos interesados ​​en un simple get, pero esto es solo una abreviatura de $ .ajax ({url: url, tipo: 'GET'}).
Matthew James Davis el
44
Si la imagen no existe, el eco de la consola es un error 404. ¿Hay alguna manera de eliminar esto, porque mi aplicación siempre espera que una imagen no exista ...
User1534664
1
No es posible, consulte: stackoverflow.com/a/16379746/1981050 . Sin embargo, esto no debería interrumpir su comportamiento. Solo producirá algunos registros extraños.
Matthew James Davis
1
los problemas de origen cruzado no están relacionados con esto
Matthew James Davis, el
69

Esto funciona para mi:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
Ensayador
fuente
2
Si bien algunas otras respuestas son mejores para su función, I +1 esta respuesta, ya que es lo que estaba buscando. Solo recuerda, ¡siempre obtendrás cero a menos que primero cargues el contenido !. es decir: window.addEventListener ('load', function () {
SpiRail
En realidad, todavía tenía problemas, incluso con la carga de la ventana. Parece que la imagen no se puede medir hasta que se almacena en caché de alguna manera. De todos modos, no trabajo para mí en la primera carga de la página. (es decir: el usuario nunca ha visto esta imagen antes). Podría funcionar para usted si tiene la imagen en una página anterior, tal vez ...
SpiRail
3
Esto se debe a que establece la fuente de la imagen e INMEDIATAMENTE verifica la altura de la imagen que aún no ha terminado de descargar. Tendría que agregar un controlador de carga para que esto funcione. Este no es un enfoque confiable por esa razón exacta.
amigo
Por qué no es fiable si se agrega un hanlder img.onload al igual que stackoverflow.com/a/12355031/988591 ?
jj_
3
¡La pregunta se refiere a un archivo , no a una imagen! Si la URL existe y no es un archivo, ¡su altura será 0!
Apostolos
44

Utilicé este script para agregar una imagen alternativa

function imgError()
{
alert('The image could not be loaded.');
}

HTML:

<img src="image.gif" onerror="imgError()" />

http://wap.w3schools.com/jsref/event_onerror.asp

Gino
fuente
24
Genial, no lo sabía. Puede hacer lo siguiente para establecer una alternativa de guardado si no existe una imagen: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully
2
@Ridcully Ah, pero ¿y si la alternativa falla? Entonces estás en un bucle sin fin, ¿verdad?
rvighne
Si la alternativa falla, supongo que hay algo más mal en el lado del servidor (o en el lado del programador: P)
Erenor Paz
Siempre puede establecer el OnError de la etiqueta img en nada al configurar la imagen alternativa para evitar el bucle sin fin.
KingOfHypocrites
Buen trabajo señor. Funciona de maravilla.
Hiren
24

Siempre que esté probando archivos en el mismo dominio, esto debería funcionar:

function fileExists(url) {
    if(url){
        var req = new XMLHttpRequest();
        req.open('GET', url, false);
        req.send();
        return req.status==200;
    } else {
        return false;
    }
}

Tenga en cuenta que este ejemplo está utilizando una solicitud GET, que además de obtener los encabezados (todo lo que necesita para verificar si el archivo existe) obtiene el archivo completo. Si el archivo es lo suficientemente grande, este método puede tardar un tiempo en completarse.

La mejor manera de hacer esto sería cambiar esta línea: req.open('GET', url, false);areq.open('HEAD', url, false);

Moob
fuente
55
Lo sentimos, esto es efectivamente lo mismo que la respuesta aceptada. Ignorame.
Moob
1
son algunos detalles más sobre el formulario que no es jQuery que pueden ser útiles
Tim Peterson
@Moob, no es "efectivamente lo mismo que la respuesta aceptada", está enviando una solicitud GET, que es muy diferente a la solicitud HEAD.
YemSalat
async: false, la operación síncrona en Firefox versión 30.0 y posterior, y en las versiones recientes / actuales de Chrome está en desuso debido a una experiencia de usuario desfavorable. Intento de uso resulta en falla / error. Debe usar async: truecon la función de devolución de llamada para la operación asincrónica.
Kevin Fegan
Por favor, espere respuesta antes de continuar ejecutando más JS? Gracias.
vladanPro
16

Recibía un problema de permisos de dominio cruzado cuando intentaba ejecutar la respuesta a esta pregunta, así que decidí:

function UrlExists(url) {
$('<img src="'+ url +'">').load(function() {
    return true;
}).bind('error', function() {
    return false;
});
}

Parece funcionar muy bien, ¡espero que esto ayude a alguien!

Shaun
fuente
3
Creo que esto perderá los valores booleanos porque se devuelven de las devoluciones de llamada, no de la función UrlExists.
mikebridge
esto no puede funcionar, deberías leer esto: stackoverflow.com/questions/14220321/…
Hacketo
¿Cómo se ve la url? , con extensión o sin extensión?
151291
10

A continuación, le indicamos cómo hacerlo de la manera ES7, si está utilizando el transpilador Babel o Typecript 2:

async function isUrlFound(url) {
  try {
    const response = await fetch(url, {
      method: 'HEAD',
      cache: 'no-cache'
    });

    return response.status === 200;

  } catch(error) {
    // console.log(error);
    return false;
  }
}

Luego, dentro de su otro asyncalcance, puede verificar fácilmente si existe url:

const isValidUrl = await isUrlFound('http://www.example.com/somefile.ext');

console.log(isValidUrl); // true || false
Nik Sumeiko
fuente
5

Utilizo este script para verificar si existe un archivo (también maneja el problema de origen cruzado):

$.ajax(url, {
       method: 'GET',
       dataType: 'jsonp'
         })
   .done(function(response) { 
        // exists code 
    }).fail(function(response) { 
        // doesnt exist
    })

Tenga en cuenta que el siguiente error de sintaxis se produce cuando el archivo que se está comprobando no contiene JSON.

SyntaxError no capturado: token inesperado <

Gëzim Musliaj
fuente
3

Una mejor opción es una llamada asíncrona para ver si existe un archivo, ya que no degrada la experiencia del usuario al esperar una respuesta del servidor. Si realiza una llamada .opencon el tercer parámetro establecido en falso (como en muchos ejemplos anteriores, por ejemplohttp.open('HEAD', url, false); ), esta es una llamada síncrona y recibe una advertencia en la consola del navegador.

Un mejor enfoque es:

function fetchStatus( address ) {
  var client = new XMLHttpRequest();
  client.onload = function() {
    // in case of network errors this might not give reliable results
    returnStatus( this.status );
  }
  client.open( "HEAD", address, true );
  client.send();
}

function returnStatus( status ) {
  if ( status === 200 ) {
    console.log( 'file exists!' );
  }
  else {
    console.log( 'file does not exist! status: ' + status );
  }
}

fuente: https://xhr.spec.whatwg.org/

Jim Bergman
fuente
También recibo una respuesta de advertencia en el registro de la consola con su método, ¿alguna idea?
Pierre
Intente llamar .opencon el tercer parámetro configurado para trueasegurarse de que lo llame de forma asincrónica, como esta client.open("HEAD", address, true);@Pierre
Jim Bergman
2

Para una computadora cliente, esto se puede lograr mediante:

try
{
  var myObject, f;
  myObject = new ActiveXObject("Scripting.FileSystemObject");
  f =   myObject.GetFile("C:\\img.txt");
  f.Move("E:\\jarvis\\Images\\");
}
catch(err)
{
  alert("file does not exist")
}

Este es mi programa para transferir un archivo a una ubicación específica y muestra alerta si no existe

yasir amin 9th-b DR.VSMPS
fuente
1
Si va a usar FileSystemObject, parece más fácil usar el método FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra
2

Función de JavaScript para verificar si existe un archivo:

function doesFileExist(urlToFile)
{
    var xhr = new XMLHttpRequest();
    xhr.open('HEAD', urlToFile, false);
    xhr.send();

    if (xhr.status == "404") {
        console.log("File doesn't exist");
        return false;
    } else {
        console.log("File exists");
        return true;
    }
}
Ani Menon
fuente
1

Primero crea la función

$.UrlExists = function(url) {
	var http = new XMLHttpRequest();
    http.open('HEAD', url, false);
    http.send();
    return http.status!=404;
}

Después de usar la función de la siguiente manera

if($.UrlExists("urlimg")){
	foto = "img1.jpg";
}else{
	foto = "img2.jpg";
}

$('<img>').attr('src',foto);

Vladimir Salguero
fuente
Lo intenté aquí pero no pude hacerlo funcionar. ¿Qué me he estado perdiendo?
Chetabahana
1

Esta es una adaptación a la respuesta aceptada, pero no pude obtener lo que necesitaba de la respuesta, y tuve que probar que funcionó, ya que era una corazonada, así que estoy poniendo mi solución aquí.

Necesitábamos verificar que existiera un archivo local y solo permitir que el archivo (un PDF) se abriera si existía. Si omite la URL del sitio web, el navegador determinará automáticamente el nombre del host, haciendo que funcione en localhost y en el servidor:

$.ajax({

    url: 'YourFolderOnWebsite/' + SomeDynamicVariable + '.pdf',
    type: 'HEAD',
    error: function () {
        //file not exists
        alert('PDF does not exist');

    },
    success: function () {
        //file exists
        window.open('YourFolderOnWebsite/' + SomeDynamicVariable + '.pdf', "_blank", "fullscreen=yes");

    }
});
Josh Harris
fuente
0

Lo que tendría que hacer es enviar una solicitud al servidor para que haga la verificación y luego devolverle el resultado.

¿Con qué tipo de servidor intenta comunicarse? Es posible que deba escribir un pequeño servicio para responder a la solicitud.

MadcapLaugher
fuente
0

Esto no aborda la pregunta del OP, pero para cualquiera que devuelva resultados de una base de datos: aquí hay un método simple que utilicé.

Si el usuario no cargara un avatar, el avatarcampo sería NULL, así que insertaría una imagen de avatar predeterminada del imgdirectorio.

function getAvatar(avatar) {
    if(avatar == null) {
        return '/img/avatar.jpg';
    } else {
        return '/avi/' + avatar;
    }
}

luego

<img src="' + getAvatar(data.user.avatar) + '" alt="">
timgavin
fuente
0

Funciona para mí, use iframe para ignorar que los navegadores muestren el mensaje de error GET

 var imgFrame = $('<iframe><img src="' + path + '" /></iframe>');
 if ($(imgFrame).find('img').attr('width') > 0) {
     // do something
 } else {
     // do something
 }
AnhMV
fuente
0

Quería una función que devolviera un valor booleano, encontré problemas relacionados con el cierre y la asincronía. Resolví de esta manera:

checkFileExistence= function (file){
    result=false;
    jQuery.ajaxSetup({async:false});
    $.get(file)
        .done(function() {
           result=true;
        })
        .fail(function() {
           result=false;
        })
    jQuery.ajaxSetup({async:true});
    return(result);
},
Gianlorenzo Lenza
fuente