Comment puis-je vérifier si le fichier existe dans jQuery ou JavaScript pur?

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

231
demandé sur Karol Selak 2010-09-05 21:05:10

17 réponses

Avec jQuery:

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

Modifier:

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

Petits changements et il pourrait vérifier le code D'état HTTP status 200 (succès), à la place.

385
répondu cichy 2014-08-13 22:13:21

Une approche similaire et plus à jour.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
62
répondu Matthew James Davis 2013-02-04 17:09:02

Cela fonctionne pour moi:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
60
répondu Tester 2012-06-27 10:15:28

J'ai utilisé ce script pour ajouter d'autres images

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

HTML:

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

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

40
répondu Gino 2012-06-16 02:07:17

Tant que vous êtes tester 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 que le fichier existe) obtient le fichier entier. Si le fichier est assez grand, cette méthode peut prendre un certain temps à compléter.

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

17
répondu Moob 2014-02-11 23:49:29

Je recevais un problème d'autorisations inter-domaines en essayant d'exécuter la réponse à cette question, donc je suis allé avec:

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

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

15
répondu Shaun 2013-11-18 17:17:39

Voici comment le faire de manière ES7, si vous utilisez Babel transpiler 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 portée async, Vous pouvez facilement vérifier si l'url existe:

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

console.log(isValidUrl); // true || false
3
répondu Nik Sumeiko 2017-03-09 13:19:36

J'utilise ce script pour vérifier si un fichier existe (il gère également le problème d'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 intercepté: jeton inattendu

2
répondu Gëzim Musliaj 2017-01-09 15:42:33

Pour un ordinateur client, ceci 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")
}

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

1
répondu yasir amin 9th-b DR.VSMPS 2013-09-21 15:12:01

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);
1
répondu Vladimir Salguero 2015-03-17 21:45:31

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;
    }
}
1
répondu Ani Menon 2016-11-16 04:59:42

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

Nous avions besoin de vérifier l'existence d'un fichier local, et d'autoriser uniquement le fichier (un PDF) à s'ouvrir s'il existait. Si vous omettez L'URL du site web, le navigateur déterminera automatiquement le nom d'hôte-ce qui le fera 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");

    }
});
1
répondu Josh Harris 2017-11-07 16:19:05

Ce que vous devez faire est d'envoyer une requête 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.

0
répondu MadcapLaugher 2010-09-05 17:11:29

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

Si l'utilisateur n'a pas téléchargé un avatar, le Champ avatar serait NULL, donc j'insérerais une image avatar par défaut dans le répertoire img.

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

Puis

<img src="' + getAvatar(data.user.avatar) + '" alt="">
0
répondu timgavin 2016-09-09 01:17:31

Cela fonctionne pour moi, utilisez iframe pour ignorer les navigateurs afficher le message D'erreur GET

 var imgFrame = $('<iframe><img src="' + path + '" /></iframe>');
 if ($(imgFrame).find('img').attr('width') > 0) {
     // do something
 } else {
     // do something
 }
0
répondu AnhMV 2017-09-27 06:38:31

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 faites un appel à .open avec 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 est:

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/

0
répondu Jim Bergman 2017-10-31 01:11:13

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);
},
0
répondu Gianlorenzo Lenza 2018-07-10 08:29:30