Comment vérifier si le fichier existe en jQuery ou en JavaScript pur?

259

Comment vérifier si un fichier sur mon serveur existe en jQuery ou en JavaScript pur?

usertest
la source

Réponses:

433

Avec jQuery:

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

ÉDITER:

Voici le code pour vérifier l'état 404, sans utiliser jQuery

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

De petits changements et il pourrait vérifier le code d'état HTTP 200 (succès) à la place.

EDIT 2: Étant donné que la synchronisation XMLHttpRequest est déconseillée, vous pouvez ajouter une méthode utilitaire comme celle-ci pour le faire en mode asynchrone:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
cichy
la source
5
dans votre exemple javascript pur, vous devez lier l' OnReadyStateChangeévénement avant de vérifier HTTP_STATUS.
RobertPitt
8
L'exemple de code est erroné et il n'y a rien à dire sur ce qui se passe sur le serveur. La question d'origine est assez vague, mais il n'y a aucune raison de supposer que le serveur qui y fonctionne mappe en fait des URL directement sur le système de fichiers. Honnêtement, je ne vois pas pourquoi cette réponse est si populaire car elle ne dit pas vraiment comment faire ce que la question demandait.
Pointy
75
@Pointy Peut-être parce que cela résout quelque chose pour lequel nous recherchons Google
Ian Hunter
4
@cichy - cela charge-t-il le fichier en mémoire ou non? Je cherche à vérifier l'existence, mais pas à charger un fichier.
Brian
11
Synchronous XMLHttpRequest sur le thread principal est obsolète en raison de ses effets néfastes sur l'expérience de l'utilisateur final. Pour plus d'aide xhr.spec.whatwg.org (cet avertissement par navigateur)
kupendra
71

Une approche similaire et plus à jour.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Matthew James Davis
la source
2
pourquoi est-ce plus à jour? $.ajaxsemble mieux s'il est plus rétrocompatible, non?
tim peterson
15
$ .ajax fonctionne aussi, mais les fonctions succès / erreur / complète sont dépréciées au profit des méthodes promises, faites / échouées / toujours. en savoir plus ici api.jquery.com/jQuery.ajax . J'ai utilisé get here car nous ne sommes intéressés que par un simple get, mais ce n'est qu'un raccourci pour $ .ajax ({url: url, tapez: 'GET'}).
Matthew James Davis
4
Si l'image n'existe pas, l'écho de la console est une erreur 404. Existe-t-il un moyen de supprimer cela, car mon application s'attend toujours à ce qu'une image n'existe pas ...
user1534664
1
Pas possible, voir: stackoverflow.com/a/16379746/1981050 . Cependant, cela ne devrait pas interrompre votre comportement. Cela produira simplement une journalisation superflue.
Matthew James Davis
1
les problèmes d'origine croisée n'y sont pas liés
Matthew James Davis
69

Cela fonctionne pour moi:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
Testeur
la source
2
Alors que d'autres réponses sont meilleures pour leur fonction, je +1 cette réponse car c'est ce que je cherchais. N'oubliez pas, vous obtiendrez toujours zéro, sauf si vous chargez le contenu en premier!. ie: window.addEventListener ('load', function () {
SpiRail
En fait, j'avais toujours des problèmes, même avec la charge de la fenêtre. Il semble que l'image ne puisse pas être mesurée tant qu'elle n'est pas mise en cache. Quoi qu'il en soit, je ne travaille pas pour moi lors du premier chargement de la page. (ie: l'utilisateur n'a jamais vu cette image auparavant). Cela pourrait fonctionner pour vous si vous avez l'image sur une page précédente, peut-être ...
SpiRail
3
En effet, il définit la source de l'image et vérifie IMMÉDIATEMENT la hauteur de l'image qui n'a pas encore terminé le téléchargement. Vous devez ajouter un gestionnaire de chargement pour que cela fonctionne. Ce n'est pas une approche fiable pour cette raison exacte.
dudewad
Pourquoi n'est-il pas fiable si vous ajoutez un support img.onload comme so stackoverflow.com/a/12355031/988591 ?
jj_
3
La question concerne un fichier , pas une image! Si l'URL existe et n'est pas un fichier, sa hauteur sera 0 !!
Apostolos
44

j'ai utilisé ce script pour ajouter une image alternative

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
la source
24
Génial - je ne le savais pas. Vous pouvez effectuer les opérations suivantes pour définir une alternative d'enregistrement si une image n'existe pas: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully
2
@Ridcully Ah, mais que faire si l'alternative échoue? Alors vous êtes dans une boucle sans fin, non?
rvighne
Si l'alternative échoue, je suppose qu'il y a quelque chose de plus mal du côté serveur (ou du côté du programmeur: P)
Erenor Paz
Vous pouvez toujours définir la valeur OnError de la balise img sur rien lorsque vous définissez l'image alt pour empêcher la boucle sans fin.
KingOfHypocrites
Excellent travail monsieur. Fonctionne comme un charme.
hiren
24

Tant que vous testez des fichiers sur le même domaine, cela devrait fonctionner:

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

Veuillez noter que cet exemple utilise une requête GET qui, en plus d'obtenir les en-têtes (tout ce dont vous avez besoin pour vérifier la météo du fichier), obtient tout le fichier. Si le fichier est suffisamment volumineux, cette méthode peut prendre un certain temps.

La meilleure façon de le faire serait de changer cette ligne: req.open('GET', url, false);àreq.open('HEAD', url, false);

Moob
la source
5
Désolé, c'est en fait la même chose que la réponse acceptée. Ignore moi.
Moob
1
ses quelques détails supplémentaires sur le formulaire non-jQuery qui peuvent être utiles
tim peterson
@Moob, ce n'est pas "effectivement la même chose que la réponse acceptée", vous envoyez une demande GET, qui est très différente de la demande HEAD.
YemSalat
async: false, le fonctionnement synchrone dans Firefox version 30.0 et ultérieure, et dans les versions récentes / actuelles de Chrome est déconseillé en raison d'une expérience utilisateur défavorable. Une tentative d'utilisation entraîne un échec / une erreur. Doit être utilisé async: trueavec la fonction de rappel pour un fonctionnement asynchrone.
Kevin Fegan
Veuillez attendre cette réponse avant de continuer à exécuter davantage de JS? Je vous remercie.
vladanPro
16

J'obtenais un problème d'autorisations entre domaines lorsque j'essayais d'exécuter la réponse à cette question, j'ai donc choisi:

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

Cela semble très bien fonctionner, j'espère que cela aide quelqu'un!

Shaun
la source
3
Je pense que cela perdra les valeurs booléennes car elles sont renvoyées par les rappels, et non par la fonction UrlExists.
mikebridge
cela ne peut pas fonctionner, vous devriez lire ceci: stackoverflow.com/questions/14220321/…
Hacketo
à quoi ressemble l'url? , avec extension ou sans extension?
151291
10

Voici comment procéder de manière ES7, si vous utilisez le transpilateur Babel ou 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;
  }
}

Ensuite, dans votre autre asyncétendue, vous pouvez facilement vérifier si l'URL existe:

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

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

J'utilise ce script pour vérifier si un fichier existe (il gère également le problème de l'origine croisée):

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

Notez que l'erreur de syntaxe suivante est levée lorsque le fichier en cours de vérification ne contient pas de JSON.

SyntaxError non capturée: jeton inattendu <

Gëzim Musliaj
la source
3

Un appel asynchrone pour voir si un fichier existe est la meilleure approche, car il ne dégrade pas l'expérience utilisateur en attendant une réponse du serveur. Si vous appelez .openavec le troisième paramètre défini sur false (comme dans de nombreux exemples ci-dessus, par exemple http.open('HEAD', url, false);), il s'agit d'un appel synchrone et vous obtenez un avertissement dans la console du navigateur.

Une meilleure approche consiste à:

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

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

Jim Bergman
la source
Je reçois également une réponse d'avertissement dans le journal de la console avec votre méthode, une idée?
Pierre
Essayez d'appeler .openavec le troisième ensemble de paramètres truepour vous assurer qu'il l'appelle de manière asynchrone, comme ceci client.open("HEAD", address, true);@Pierre
Jim Bergman
2

Pour un ordinateur client, cela peut être réalisé par:

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

Ceci est mon programme pour transférer un fichier vers un emplacement spécifique et affiche une alerte s'il n'existe pas

yasir amin 9th-b DR.VSMPS
la source
1
Si vous allez utiliser FileSystemObject, il semble plus facile d'utiliser la méthode FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra
2

Fonction JavaScript pour vérifier si un fichier existe:

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
la source
1

Crée d'abord la fonction

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

Après avoir utilisé la fonction comme suit

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

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

Vladimir Salguero
la source
J'ai essayé ici mais je n'ai pas pu le faire fonctionner. Qu'est-ce qui me manque?
Chetabahana
1

Ceci est une adaptation à la réponse acceptée, mais je n'ai pas pu obtenir ce dont j'avais besoin dans la réponse, et j'ai dû tester cela fonctionnait car c'était une intuition, donc je mets ma solution ici.

Nous devions vérifier qu'un fichier local existait et ne permettre l'ouverture du fichier (un PDF) que s'il existait. Si vous omettez l'URL du site Web, le navigateur déterminera automatiquement le nom d'hôte - en le faisant fonctionner dans localhost et sur le serveur:

$.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
la source
0

Ce que vous auriez à faire serait d'envoyer une demande au serveur pour qu'il fasse la vérification, puis de vous renvoyer le résultat.

Avec quel type de serveur essayez-vous de communiquer? Vous devrez peut-être écrire un petit service pour répondre à la demande.

MadcapLaugher
la source
0

Cela ne répond pas à la question du PO, mais pour quiconque renvoie des résultats d'une base de données: voici une méthode simple que j'ai utilisée.

Si l'utilisateur ne téléchargeait pas d'avatar, le avatarchamp le serait NULL, alors j'insérerais une image d'avatar par défaut du imgrépertoire.

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

puis

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

Cela fonctionne pour moi, utilisez iframe pour ignorer les navigateurs afficher un message d'erreur GET

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

Je voulais une fonction qui retournerait un booléen, j'ai rencontré des problèmes liés à la fermeture et à l'asynchronicité. J'ai résolu de cette façon:

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
la source