Come posso verificare se il file esiste in jQuery o JavaScript puro?


Risposte:


433

Con jQuery:

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

MODIFICARE:

Ecco il codice per controllare lo stato 404, senza usare jQuery

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

Piccole modifiche e potrebbe invece verificare lo stato del codice di stato HTTP 200 (esito positivo).

MODIFICA 2: poiché la sincronizzazione XMLHttpRequest è obsoleta, è possibile aggiungere un metodo di utilità come questo per farlo asincrono:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}

5
nel tuo puro esempio JavaScript devi essere un OnReadyStateChangeevento vincolante prima di controllare HTTP_STATUS.
RobertPitt,

8
Il codice di esempio è errato e non c'è niente di tutto ciò che accade sul server. La domanda originale è piuttosto vaga, ma non c'è motivo di presumere che il server in esecuzione sia in realtà mappando gli URL direttamente sul file system. Onestamente, non vedo perché questa risposta sia così popolare in quanto non dice davvero come fare ciò che la domanda ha posto.
Pointy,

75
@Pointy Potrebbe essere perché risolve qualcosa per il quale tutti noi siamo su Google
Ian Hunter

4
@cichy: questo carica il file in memoria o no? Sto cercando di verificare l'esistenza ma non caricare un file.
Brian,

11
XMLHttpRequest sincrono nel thread principale è obsoleto a causa dei suoi effetti dannosi per l'esperienza dell'utente finale. Per ulteriori informazioni xhr.spec.whatwg.org (questo avviso del browser)
kupendra,

71

Un approccio simile e più aggiornato.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })

2
perché è più aggiornato? $.ajaxsembra meglio se è più compatibile con le versioni precedenti, giusto?
Tim Peterson,

15
Anche $ .ajax funziona, ma le funzioni di successo / errore / complete sono deprecate a favore dei metodi promesse, fatto / fallito / sempre. leggi di più qui api.jquery.com/jQuery.ajax . Ho usato get qui perché ci interessa solo un get semplice, ma questa è solo una scorciatoia per $ .ajax ({url: url, digitare: 'GET'}).
Matthew James Davis,

4
Se l'immagine non esiste, l'eco della console presenta un errore 404. C'è un modo per rimuoverlo, perché la mia applicazione si aspetta sempre che un'immagine non esista ...
user1534664

1
Impossibile, consultare: stackoverflow.com/a/16379746/1981050 . Tuttavia, ciò non dovrebbe interrompere il tuo comportamento. Produrrà solo una registrazione estranea.
Matthew James Davis,

1
i problemi di origine incrociata non sono collegati a questo
Matthew James Davis,

69

Questo funziona per me:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}

2
Mentre alcune altre risposte sono migliori per la loro funzione, ho +1 su questa risposta in quanto è quello che stavo cercando. Ricorda, otterrai sempre zero a meno che non carichi prima il contenuto !. cioè: window.addEventListener ('load', function () {
SpiRail

In realtà, ho ancora avuto problemi, anche con il caricamento della finestra. Sembra che l'immagine non possa essere misurata fino a quando non viene memorizzata nella cache in qualche modo. Ad ogni modo, non lavoro per me al primo caricamento della pagina. (ovvero: l'utente non ha mai visto questa immagine prima). Potrebbe funzionare per te se hai l'immagine in una pagina precedente, forse ...
SpiRail,

3
Questo perché imposta la fonte dell'immagine e IMMEDIATAMENTE controlla per vedere l'altezza dell'immagine che non ha ancora terminato il download. Dovresti aggiungere un gestore onload per farlo funzionare. Questo non è un approccio affidabile per quel motivo esatto.
Dudewad,

Perché non è affidabile se si aggiunge un hanlder img.onload in questo modo stackoverflow.com/a/12355031/988591 ?
jj_

3
La domanda riguarda un file , non un'immagine! Se l'URL esiste e non è un file, la sua altezza sarà 0 !!
Apostolos,

44

ho usato questo script per aggiungere un'immagine 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


24
Fantastico, non lo sapevo. È possibile effettuare le seguenti operazioni per impostare un'alternativa di salvataggio se non esiste un'immagine: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully

2
@Ridcully Ah, ma cosa succede se l'alternativa fallisce? Allora sei in un ciclo infinito giusto?
rvighne

Se l'alternativa fallisce, suppongo che ci sia qualcosa di più sbagliato sul lato server (o sul lato del programmatore: P)
Erenor Paz

È sempre possibile impostare OnError del tag img su nulla quando si imposta l'immagine alt per impedire il loop infinito.
KingOfHypocrites

Ottimo lavoro signore. Funziona come un fascino.
hiren,

24

Finché stai testando i file sullo stesso dominio, questo dovrebbe funzionare:

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

Si noti che in questo esempio viene utilizzata una richiesta GET, che oltre a ottenere le intestazioni (tutto ciò che serve per verificare il tempo in cui esiste il file) ottiene l'intero file. Se il file è abbastanza grande, il completamento di questo metodo può richiedere del tempo.

Il modo migliore per farlo sarebbe cambiare questa linea: req.open('GET', url, false);areq.open('HEAD', url, false);


5
Spiacenti, questa è effettivamente la stessa della risposta accettata. Ignorarmi.
Moob,

1
è qualche dettaglio in più sul modulo non jQuery che può essere utile
tim peterson

@Moob, non è "effettivamente uguale alla risposta accettata", stai inviando una richiesta GET, che è molto diversa dalla richiesta HEAD.
YemSalat,

async: false, il funzionamento sincrono in Firefox versione 30.0 e successive e nelle versioni recenti / attuali di Chrome è obsoleto a causa dell'esperienza dell'utente sfavorevole. Tentativo di utilizzo provoca errori / errori. Dovrebbe usare async: truecon la funzione di callback per il funzionamento asincrono.
Kevin Fegan,

Attendi questa risposta prima di continuare a eseguire ulteriori JS? Grazie.
vladanPro,

16

Stavo ricevendo un problema di autorizzazioni tra domini quando provavo a eseguire la risposta a questa domanda, quindi sono andato con:

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

Sembra funzionare alla grande, spero che questo aiuti qualcuno!


3
Penso che questo perderà i valori booleani perché vengono restituiti dai callback, non dalla funzione UrlExists.
mikebridge,

questo non può lavoro, si dovrebbe leggere questo: stackoverflow.com/questions/14220321/...
Hacketo

come appare l'URL? , con estensione o senza estensione?
151291,

10

Ecco come farlo in modo ES7, se stai usando il transpiler di Babel o Typescript 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;
  }
}

Quindi, all'interno dell'altro asyncambito, puoi facilmente verificare se esiste l'URL:

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

console.log(isValidUrl); // true || false

5

Uso questo script per verificare se esiste un file (gestisce anche il problema dell'origine incrociata):

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

Si noti che il seguente errore di sintassi viene generato quando il file da controllare non contiene JSON.

Uncaught SyntaxError: token imprevisto <


3

Una chiamata asincrona per vedere se esiste un file è l'approccio migliore, perché non degrada l'esperienza dell'utente in attesa di una risposta dal server. Se si effettua una chiamata .opencon il terzo parametro impostato su false (come in molti esempi precedenti, ad esempio http.open('HEAD', url, false);), si tratta di una chiamata sincrona e viene visualizzato un avviso nella console del browser.

Un approccio migliore è:

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

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


Ricevo anche una risposta di avviso nel registro della console con il tuo metodo, qualche idea?
Pierre,

Prova a chiamare .opencon il terzo parametro impostato su trueper assicurarti che lo chiami in modo asincrono, come questo client.open("HEAD", address, true);@Pierre
Jim Bergman

2

Per un computer client questo può essere ottenuto 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")
}

Questo è il mio programma per trasferire un file in una posizione specifica e mostra un avviso se non esiste


1
Se hai intenzione di utilizzare FileSystemObject sembra più facile usare il metodo FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra

2

Funzione JavaScript per verificare l'esistenza di un file:

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

1

Innanzitutto crea la funzione

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

Dopo aver usato la funzione come segue

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

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


Ho provato qui ma non sono riuscito a farlo funzionare. Cosa mi sono perso?
Chetabahana,

1

Questo è un adattamento alla risposta accettata, ma non ho potuto ottenere ciò di cui avevo bisogno dalla risposta, e ho dovuto testarlo funzionando perché era un sospetto, quindi sto mettendo la mia soluzione qui.

Dovevamo verificare l'esistenza di un file locale e consentire l'apertura del file (un PDF) solo se esisteva. Se si omette l'URL del sito Web, il browser determinerà automaticamente il nome host, facendolo funzionare in localhost e sul server:

$.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");

    }
});

0

Quello che dovresti fare è inviare una richiesta al server affinché esegua il controllo e quindi rispedirti il ​​risultato.

Con quale tipo di server stai cercando di comunicare? Potrebbe essere necessario scrivere un piccolo servizio per rispondere alla richiesta.


0

Questo non affronta la domanda del PO, ma per chiunque stia restituendo risultati da un database: ecco un metodo semplice che ho usato.

Se l'utente non ha caricato un avatar, il avatarcampo sarebbe NULL, quindi inserisco un'immagine avatar predefinita dalla imgdirectory.

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

poi

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

0

Funziona per me, usa iframe per ignorare i browser mostra il messaggio di errore GET

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

0

Volevo una funzione che restituisse un valore booleano, ho riscontrato problemi legati alla chiusura e all'asincronicità. Ho risolto in questo modo:

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);
},
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.