Як перевірити, чи існує файл у jQuery чи чистому JavaScript?


Відповіді:


433

За допомогою jQuery:

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

Редагувати:

Ось код для перевірки стану 404, без використання jQuery

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

Невеликі зміни, і замість цього він може перевірити наявність статусу HTTP-код 200 (успіх).

EDIT 2: Оскільки синхронізація XMLHttpRequest застаріла, ви можете додати такий утилітний спосіб, як це зробити для асинхронізації:

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

5
у вашому чистому прикладі javascript ви повинні бути обов'язковим для OnReadyStateChangeподії, перш ніж перевірити HTTP_STATUS.
RobertPitt

8
Приклад код помилковий, і нічого, що сказано про те, що відбувається на сервері, нічого не сказано. Оригінальне запитання є досить розпливчастим, але немає причин вважати, що сервер, який там працює, насправді відображає URL-адреси безпосередньо у файловій системі. Чесно кажучи, я не бачу, чому ця відповідь настільки популярна, оскільки вона насправді не говорить про те, як зробити те, про що задали питання.
Pointy

75
@Pointy Можливо, тому що це вирішує щось, про що ми решту гуглимо
Ian Hunter

4
@cichy - завантажує це файл у пам'ять чи ні? Я хочу перевірити наявність, але не завантажити файл.
Брайан

11
Синхронний XMLHttpRequest в головному потоці застарілий через його згубний вплив на досвід кінцевого користувача. Для отримання додаткової допомоги xhr.spec.whatwg.org (Це попередження браузером)
kupendra

71

Аналогічний і більш сучасний підхід.

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

2
чому це більш сучасне? $.ajaxздається, краще, якщо він сумісніший із зворотним, правда?
tim peterson

15
$ .ajax теж працює, але функція успіху / помилки / завершення застаріла на користь методів обіцянок, виконаних / відмов / завжди. детальніше про це читайте тут api.jquery.com/jQuery.ajax . Я використовував тут, тому що нас цікавить лише просте отримання, але це лише скорочення для $ .ajax ({url: url, type: 'GET'}).
Меттью Джеймс Девіс

4
Якщо зображення не існує, консоль лунає помилкою 404. Чи є можливість видалити це, оскільки моя програма завжди очікує, що одне зображення не існує ...
user1534664

1
Неможливо переглянути: stackoverflow.com/a/16379746/1981050 . Однак це не повинно переривати вашу поведінку. Це просто призведе до деякої сторонньої лісозаготівлі.
Меттью Джеймса Девіса

1
Питання перехресного походження не пов’язані з цим
Метью Джеймс Девіс

69

Це працює для мене:

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

2
Хоча деякі інші відповіді краще за їх функцію, я поставив +1 цій відповіді, оскільки це те, що я шукав. Пам'ятайте, ви завжди отримаєте нуль, якщо спочатку не завантажите вміст !. тобто: window.addEventListener ('load', function () {
SpiRail

Насправді у мене були проблеми, навіть із завантаженням вікон. Здається, що зображення не можна виміряти, поки воно якось не кешується. У всякому разі, я не працюю для мене під час першого завантаження сторінки. (тобто: користувач ніколи раніше не бачив цього зображення). Можливо, це може спрацювати для вас, якщо у вас є зображення на попередній сторінці, можливо ...
SpiRail

3
Це тому, що воно встановлює джерело зображення та НЕМОВНО перевіряє висоту зображення, яке ще не завершено завантаженням. Для цього вам доведеться додати обробник завантаження. З цієї точної причини це не є надійним підходом.
dudewad

Чому не вважається надійним , якщо додати img.onload hanlder як так stackoverflow.com/a/12355031/988591 ?
jj_

3
Питання задається про файл , а не про зображення! Якщо URL-адреса існує і не є файлом, її висота буде 0 !!
Апостолос

44

Я використовував цей скрипт, щоб додати альтернативне зображення

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
Чудово - цього не знав. Ви можете зробити наступне, щоб встановити альтернативу збереження, якщо зображення не існує: <img src = "image.gif" onerror = "this.src = 'alternative.gif'>>
Ridcully

2
@Ridcully Ах, але що робити, якщо альтернатива не вдається? Тоді ти в нескінченному циклі, правда?
rvighne

Якщо альтернатива не вдається, я припускаю, що на стороні сервера (або на стороні програміста) щось більше не так: P)
Еренор Пас

Ви завжди можете встановити OnError тегу img на нічого, встановивши зображення alt, щоб запобігти нескінченному циклу.
KingOfHypocrites

Чудова робота, сер. Працює як шарм.
hiren

24

Поки ви тестуєте файли в одному домені, це має працювати:

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

Зверніть увагу: у цьому прикладі використовується GET-запит, який окрім отримання заголовків (усе, що потрібно перевірити, чи існує файл), отримує весь файл. Якщо файл досить великий, цей спосіб може зайняти деякий час.

Кращим способом зробити це буде зміна цього рядка: req.open('GET', url, false);наreq.open('HEAD', url, false);


5
Вибачте, це фактично те саме, що і прийнята відповідь. Ігнорувати мене.
Moob

1
ще кілька деталей про форму без jQuery, яка може бути корисною
Tim peterson

@Moob, це не "фактично те саме, що і прийнята відповідь", ви надсилаєте GET-запит, який відрізняється від HEAD-запиту.
YemSalat

async: false, синхронна робота у Firefox версії 30.0 та пізніших версій, а також у останніх / поточних версіях Chrome застаріла через несприятливий досвід користувачів. Спроба використання призводить до помилки / помилки. Потрібно використовувати async: trueз функцією зворотного дзвінка для асинхронної роботи.
Кевін Феган

Будь ласка, зачекайте відповіді, перш ніж продовжувати виконувати подальші JS? Дякую.
vladanPro

16

Під час спроби запустити відповідь на це запитання я отримував проблеми міждоменних дозволів, тому я вирішив:

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

Здається, це працює чудово, сподіваюся, що це комусь допоможе!


3
Я думаю, що це втратить булеві значення, оскільки вони повертаються з зворотних викликів, а не з функції UrlExists.
mikebridge

це може не працювати, ви повинні прочитати: stackoverflow.com/questions/14220321 / ...
Hacketo

як виглядає URL-адреса? , з розширенням або без розширення?
151291

10

Ось як це зробити ES7 способом, якщо ви використовуєте транспілятор Babel або 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;
  }
}

Тоді всередині іншого asyncдіапазону ви можете легко перевірити, чи існує URL-адреса:

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

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

5

Я використовую цей скрипт, щоб перевірити, чи існує файл (також він обробляє проблему перехресного походження):

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

Зауважте, що наступна помилка синтаксису видається, коли перевіряється файл не містить JSON.

Uncaught SyntaxError: Несподіваний маркер <


3

Асинхронний виклик, щоб побачити, чи існує файл, є кращим підходом, оскільки він не погіршує користувацький досвід, чекаючи відповіді від сервера. Якщо ви здійснюєте виклик .openз третім параметром, встановленим значенням false (як, наприклад, у багатьох прикладах вище)http.open('HEAD', url, false); ), це синхронний дзвінок, і ви отримуєте попередження на консолі браузера.

Кращий підхід:

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

джерело: https://xhr.spec.whatwg.org/


Я також отримую попередження у журналі консолі з вашим методом, будь-яка ідея?
П’єр

Спробуйте зателефонувати .openза допомогою третього параметра, щоб trueпереконатися, що він називає його асинхронно, як це client.open("HEAD", address, true);@Pierre
Джим Бергман

2

Для клієнтського комп'ютера цього можна досягти:

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

Це моя програма для перенесення файлу в певне місце і показує попередження, якщо його не існує


1
Якщо ви збираєтеся використовувати FileSystemObject, здається, простіше використовувати метод FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Марк F Guerra

2

Функція JavaScript для перевірки наявності файлу:

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

Спочатку створюється функція

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

Після використання функції слід наступним чином

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

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


Я спробував тут, але не міг змусити його працювати. Що я пропустив?
Четабахана

1

Це пристосування до прийнятої відповіді, але я не зміг отримати те, що мені було потрібно, і мені довелося перевірити це, як це було придумкою, тому я ставлю своє рішення тут.

Нам потрібно було перевірити, чи існував локальний файл, і дозволити відкриття файлу (PDF) лише тоді, коли він існував. Якщо ви опустите URL-адресу веб-сайту, браузер автоматично визначить ім'я хоста - змусить його працювати в localhost та на сервері:

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

Що потрібно зробити, це надіслати запит на сервер, щоб він міг зробити перевірку, а потім надіслати вам результат.

З яким типом сервера ви намагаєтесь спілкуватися? Вам може знадобитися написати невелику послугу, щоб відповісти на запит.


0

Це не стосується питання ОП, але для тих, хто повертає результати з бази даних: ось простий метод, який я використав.

Якби користувач не завантажив аватар, це avatarбуло б поле NULL, тож я б вставив у imgкаталог каталог аватар за замовчуванням .

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

тоді

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

0

Це працює для мене, використовуйте iframe, щоб ігнорувати браузери, показувати GET повідомлення про помилку

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

0

Мені хотілося, щоб функція повертала булевий характер, у мене виникли проблеми, пов'язані із закриттям та асинхронністю. Я вирішив так:

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);
},
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.