Wie überprüfe ich, ob eine Datei in jQuery oder reinem JavaScript vorhanden ist?

259

Wie überprüfe ich, ob eine Datei auf meinem Server in jQuery oder reinem JavaScript vorhanden ist?

Usertest
quelle

Antworten:

433

Mit jQuery:

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

BEARBEITEN:

Hier ist der Code zum Überprüfen des 404-Status ohne Verwendung von jQuery

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

Kleine Änderungen und es könnte stattdessen nach dem Status HTTP-Statuscode 200 (Erfolg) suchen.

BEARBEITEN 2: Da die Synchronisierung von XMLHttpRequest veraltet ist, können Sie eine Dienstprogrammmethode wie diese hinzufügen, um sie asynchron auszuführen:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
Cichy
quelle
5
In Ihrem reinen Javascript-Beispiel sollten Sie ein Bindungsereignis sein OnReadyStateChange, bevor Sie HTTP_STATUS überprüfen.
RobertPitt
8
Der Beispielcode ist falsch und es wird überhaupt nichts darüber gesagt, was auf dem Server vor sich geht. Die ursprüngliche Frage ist ziemlich vage, aber es gibt keinen Grund anzunehmen, dass der Server, der dort ausgeführt wird, tatsächlich URLs direkt dem Dateisystem zuordnet. Ehrlich gesagt verstehe ich nicht, warum diese Antwort so beliebt ist, da sie nicht wirklich sagt, wie man das macht, worum es in der Frage geht.
Pointy
75
@Pointy Könnte sein, weil es etwas löst, nach dem der Rest von uns googelt
Ian Hunter
4
@cichy - lädt dies die Datei in den Speicher oder nicht? Ich möchte nach Existenz suchen, aber keine Datei laden.
Brian
11
Die synchrone XMLHttpRequest im Hauptthread ist aufgrund ihrer nachteiligen Auswirkungen auf die Benutzererfahrung veraltet. Für weitere Hilfe xhr.spec.whatwg.org (Diese Warnung von Browser)
Kupendra
71

Ein ähnlicher und aktuellerer Ansatz.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Matthew James Davis
quelle
2
Warum ist das aktueller? $.ajaxscheint besser, wenn es abwärtskompatibler ist, oder?
Tim Peterson
15
$ .ajax funktioniert auch, aber Erfolg / Fehler / vollständige Funktionen werden zugunsten von Versprechen, erledigten / fehlgeschlagenen / immer-Methoden veraltet. Lesen Sie hier mehr darüber api.jquery.com/jQuery.ajax . Ich habe get here verwendet, weil wir nur an einem einfachen get interessiert sind, aber dies ist nur eine Abkürzung für $ .ajax ({url: url, type: 'GET'}).
Matthew James Davis
4
Wenn das Image nicht vorhanden ist, ist das Konsolenecho ein 404-Fehler. Gibt es eine Möglichkeit, dies zu entfernen, da meine Anwendung immer erwartet, dass ein Bild nicht vorhanden ist ...
user1534664
1
Nicht möglich, siehe: stackoverflow.com/a/16379746/1981050 . Dies sollte Ihr Verhalten jedoch nicht unterbrechen. Es wird nur eine fremde Protokollierung ergeben.
Matthew James Davis
1
Cross-Origin-Probleme haben nichts damit zu tun
Matthew James Davis
69

Das funktioniert bei mir:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
Prüfer
quelle
2
Während einige andere Antworten für ihre Funktion besser sind, +1 ich diese Antwort, da es das ist, wonach ich gesucht habe. Denken Sie daran, Sie erhalten immer Null, es sei denn, Sie laden zuerst den Inhalt!. dh: window.addEventListener ('load', function () {
SpiRail
Eigentlich hatte ich immer noch Probleme, auch mit der Fensterlast. Es scheint, dass das Bild erst gemessen werden kann, wenn es irgendwie zwischengespeichert ist. Auf jeden Fall arbeite ich beim ersten Laden der Seite nicht für mich. (dh: Benutzer hat dieses Bild noch nie gesehen). Es könnte für Sie funktionieren, wenn Sie das Bild auf einer vorherigen Seite haben, vielleicht ...
SpiRail
3
Dies liegt daran, dass die Quelle des Bildes festgelegt wird und SOFORT überprüft wird, ob die Höhe des Bildes noch nicht vollständig heruntergeladen wurde. Sie müssten einen Onload-Handler hinzufügen, damit dies funktioniert. Dies ist aus genau diesem Grund kein verlässlicher Ansatz.
Dudewad
Warum ist es nicht zuverlässig, wenn Sie einen img.onload-Ordner wie " stackoverflow.com/a/12355031/988591" hinzufügen ?
jj_
3
Die Frage fragt nach einer Datei , nicht nach einem Bild! Wenn die URL existiert und keine Datei ist, ist ihre Höhe 0 !!
Apostolos
44

Ich habe dieses Skript verwendet, um ein alternatives Bild hinzuzufügen

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
quelle
24
Großartig - wusste das nicht. Sie können Folgendes tun, um eine Sicherungsalternative festzulegen, wenn kein Bild vorhanden ist: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully
2
@Ridcully Ah, aber was ist, wenn die Alternative fehlschlägt? Dann bist du in einer Endlosschleife, oder?
Rvighne
Wenn die Alternative fehlschlägt, stimmt vermutlich etwas mehr auf der Serverseite (oder auf der Programmierseite: P) nicht
Erenor Paz
Sie können den OnError des img-Tags jederzeit auf nichts setzen, wenn Sie das Alt-Image festlegen, um die Endlosschleife zu verhindern.
KingOfHypocrites
Großartige Arbeit, Sir. Klappt wunderbar.
Hiren
24

Solange Sie Dateien in derselben Domäne testen, sollte dies funktionieren:

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

Bitte beachten Sie, dass in diesem Beispiel eine GET-Anforderung verwendet wird, die neben dem Abrufen der Header (alles, was Sie benötigen, um zu überprüfen, ob die Datei vorhanden ist) die gesamte Datei abruft. Wenn die Datei groß genug ist, kann es eine Weile dauern, bis diese Methode abgeschlossen ist.

Der bessere Weg, dies zu tun, wäre, diese Zeile zu ändern: req.open('GET', url, false);zureq.open('HEAD', url, false);

Moob
quelle
5
Entschuldigung, dies entspricht praktisch der akzeptierten Antwort. Ignoriere mich.
Moob
1
Es gibt einige weitere Details auf dem Nicht-jQuery-Formular, die hilfreich sein können
Tim Peterson
@Moob, es ist nicht "effektiv dasselbe wie die akzeptierte Antwort", Sie senden eine GET-Anfrage, die sich stark von der HEAD-Anfrage unterscheidet.
YemSalat
async: falseDer Synchronbetrieb in Firefox Version 30.0 und höher sowie in neueren / aktuellen Versionen von Chrome ist aufgrund der ungünstigen Benutzererfahrung veraltet. Ein versuchter Gebrauch führt zu einem Fehler. Sollte async: truemit Rückruffunktion für den asynchronen Betrieb verwendet werden.
Kevin Fegan
Bitte warten Sie auf die Antwort, bevor Sie weitere JS ausführen. Danke dir.
VladanPro
16

Beim Versuch, die Antwort auf diese Frage auszuführen, trat ein domänenübergreifendes Berechtigungsproblem auf.

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

Es scheint großartig zu funktionieren, hoffe das hilft jemandem!

Shaun
quelle
3
Ich denke, dies wird die booleschen Werte verlieren, weil sie von den Rückrufen zurückgegeben werden, nicht von der UrlExists-Funktion.
Mikebridge
Dies kann nicht funktionieren, Sie sollten dies lesen: stackoverflow.com/questions/14220321/…
Hacketo
Wie sieht die URL aus? , mit oder ohne Verlängerung?
151291
10

So geht's mit ES7, wenn Sie Babel Transpiler oder Typescript 2 verwenden:

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

In Ihrem anderen asyncBereich können Sie dann leicht überprüfen, ob eine URL vorhanden ist:

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

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

Ich verwende dieses Skript, um zu überprüfen, ob eine Datei vorhanden ist (es behandelt auch das Cross-Origin-Problem):

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

Beachten Sie, dass der folgende Syntaxfehler ausgelöst wird, wenn die zu überprüfende Datei kein JSON enthält.

Nicht erfasster SyntaxError: Unerwartetes Token <

Gëzim Musliaj
quelle
3

Ein asynchroner Aufruf, um festzustellen, ob eine Datei vorhanden ist, ist der bessere Ansatz, da er die Benutzererfahrung nicht beeinträchtigt, indem er auf eine Antwort vom Server wartet. Wenn Sie .openmit dem dritten Parameter auf false aufrufen (wie in vielen obigen Beispielen zum Beispiel)http.open('HEAD', url, false); ), handelt es sich um einen synchronen Aufruf, und Sie erhalten eine Warnung in der Browserkonsole.

Ein besserer Ansatz ist:

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

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

Jim Bergman
quelle
Ich erhalte auch eine Warnantwort im Konsolenprotokoll mit Ihrer Methode. Haben Sie eine Idee?
Pierre
Versuchen Sie, .openmit dem dritten Parametersatz aufzurufen true, um sicherzustellen, dass er asynchron client.open("HEAD", address, true);aufgerufen wird , wie dieser @Pierre
Jim Bergman
2

Für einen Client-Computer kann dies erreicht werden durch:

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

Dies ist mein Programm zum Übertragen einer Datei an einen bestimmten Speicherort und zeigt eine Warnung an, wenn sie nicht vorhanden ist

yasir amin 9th-b DR.VSMPS
quelle
1
Wenn Sie FileSystemObject verwenden, scheint es einfacher zu sein, die FileExists () -Methode zu verwenden. msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra
2

JavaScript-Funktion zum Überprüfen, ob eine Datei vorhanden ist:

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
quelle
1

Erstellt zuerst die Funktion

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

Nach Verwendung der Funktion wie folgt

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

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

Vladimir Salguero
quelle
Ich habe es hier versucht , konnte es aber nicht zum Laufen bringen. Was habe ich vermisst?
Chetabahana
1

Dies ist eine Anpassung an die akzeptierte Antwort, aber ich konnte nicht das bekommen, was ich brauchte, und musste testen, ob dies funktioniert hat, da es eine Vermutung war, also stelle ich meine Lösung hier vor.

Wir mussten überprüfen, ob eine lokale Datei vorhanden war, und die Datei (eine PDF-Datei) nur öffnen lassen, wenn sie vorhanden war. Wenn Sie die URL der Website weglassen, ermittelt der Browser automatisch den Hostnamen, sodass er in localhost und auf dem Server funktioniert:

$.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
quelle
0

Sie müssten lediglich eine Anfrage an den Server senden, damit dieser die Prüfung durchführen kann, und dann das Ergebnis an Sie zurücksenden.

Mit welchem ​​Servertyp möchten Sie kommunizieren? Möglicherweise müssen Sie einen kleinen Dienst schreiben, um auf die Anfrage zu antworten.

MadcapLaugher
quelle
0

Dies geht nicht auf die Frage des OP ein, sondern für alle, die Ergebnisse aus einer Datenbank zurückgeben: Hier ist eine einfache Methode, die ich verwendet habe.

Wenn der Benutzer keinen Avatar hochladen avatarwürde NULL, wäre das Feld , also würde ich ein Standard-Avatar-Bild aus dem imgVerzeichnis einfügen .

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

dann

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

Es funktioniert für mich, verwenden Sie iframe, um Browser zu ignorieren, die GET-Fehlermeldung anzeigen

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

Ich wollte eine Funktion, die einen Booleschen Wert zurückgibt. Ich stieß auf Probleme im Zusammenhang mit dem Schließen und der Asynchronität. Ich habe es so gelöst:

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
quelle