Как проверить, существует ли файл в 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 (успех), вместо этого.

РЕДАКТИРОВАТЬ 2: Поскольку синхронизация XMLHttpRequest устарела, вы можете добавить вспомогательный метод, подобный этому, чтобы сделать его асинхронным:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
Cichy
источник
5
в вашем чистом примере javascript вы должны OnReadyStateChangeсвязать событие перед проверкой HTTP_STATUS.
Роберт Питт
8
Пример кода неверен, и ничего не сказано о том, что происходит на сервере. Исходный вопрос довольно расплывчатый, но нет оснований предполагать, что работающий там сервер фактически отображает URL-адреса непосредственно в файловой системе. Честно говоря, я не понимаю, почему этот ответ так популярен, поскольку на самом деле не говорится, как сделать то, что задал вопрос.
Заостренный
75
@Pointy Может быть потому, что это решает то, что остальные из нас ищут в Google
Ян Хантер
4
@cichy - это загружает файл в память или нет? Я ищу, чтобы проверить наличие, но не загрузить файл.
Брайан
11
Синхронный XMLHttpRequest в основном потоке не рекомендуется из-за его пагубных последствий для конечного пользователя. Для получения дополнительной помощи xhr.spec.whatwg.org (Это предупреждение от браузера)
kupendra
71

Подобный и более современный подход.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Мэтью Джеймс Дэвис
источник
2
почему это более актуально? $.ajaxкажется лучше, если он более обратно совместим, верно?
Тим Петерсон
15
$ .ajax тоже работает, но функции success / error / complete не рекомендуются в пользу методов обещаний, done / fail / always. Узнайте больше об этом здесь api.jquery.com/jQuery.ajax . Я использовал get здесь, потому что нас интересует только простое get, но это просто сокращение для $ .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
@ Скорее, но что, если альтернатива не удалась? Тогда ты в бесконечной петле, верно?
rvighne
Если альтернатива терпит неудачу, я полагаю, что что-то более неправильное на стороне сервера (или на стороне программиста: P)
Эренор Паз
Вы всегда можете установить OnError тега img в ничто при установке альтернативного изображения, чтобы предотвратить бесконечный цикл.
KingOfHypocrites
Отличная работа, сэр. Работает как шарм.
нанять
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);

Moob
источник
5
Извините, это фактически совпадает с принятым ответом. Игнорируй меня.
Муб
1
Вот еще некоторые подробности о не-jQuery форме, которые могут быть полезны
Тим Петерсон
@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;
});
}

Кажется, работает отлично, надеюсь, это поможет кому-то!

Shaun
источник
3
Я думаю, что это потеряет логические значения, потому что они возвращаются из обратных вызовов, а не функции UrlExists.
Майкбридж
это не может работать, вы должны прочитать это: stackoverflow.com/questions/14220321/…
Hacketo
как выглядит URL? с расширением или без расширения?
151291,
10

Вот как это сделать ES7, если вы используете Babel Transpiler или 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")
}

Это моя программа для передачи файла в определенное место и показывает предупреждение, если он не существует

Ясир Амин 9-й DR.VSMPS
источник
1
Если вы собираетесь использовать FileSystemObject, кажется, проще использовать метод FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Марк Ф. Герра
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-адрес веб-сайта, браузер автоматически определит имя хоста, чтобы оно работало на локальном хосте и на сервере:

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

Что вам нужно сделать, это отправить запрос на сервер, чтобы он сделал проверку, а затем отправить результат обратно к вам.

С каким типом сервера вы пытаетесь установить связь? Возможно, вам придется написать небольшой сервис, чтобы ответить на запрос.

MadcapLaugher
источник
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="">
timgavin
источник
0

Это работает для меня, используйте iframe, чтобы игнорировать браузеры показывают сообщение об ошибке GET

 var imgFrame = $('<iframe><img src="' + path + '" /></iframe>');
 if ($(imgFrame).find('img').attr('width') > 0) {
     // do something
 } else {
     // do something
 }
AnhMV
источник
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);
},
Джанлорензо Ленца
источник