Dosyanın jQuery veya salt JavaScript'te olup olmadığını nasıl kontrol edebilirim?


259

Sunucumdaki bir dosyanın jQuery veya salt JavaScript'te olup olmadığını nasıl kontrol edebilirim?

Yanıtlar:


433

JQuery ile:

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

DÜZENLE:

İşte jQuery kullanmadan 404 durumunu kontrol etmek için kod

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

Küçük değişiklikler yapar ve bunun yerine durum HTTP durum kodu 200'ü (başarılı) kontrol edebilir.

DÜZENLEME 2: XMLHttpRequest eşitlemesi onaylanmadığından, zaman uyumsuz yapmak için şöyle bir yardımcı program yöntemi ekleyebilirsiniz:

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

5
saf javascript örneğinizde OnReadyStateChange, HTTP_STATUS'u kontrol etmeden önce bağlayıcı olay olmalısınız.
RobertPitt

8
Örnek kod yanlış ve sunucuda neler olduğu hakkında hiçbir şey söylenmiyor. Orijinal soru oldukça belirsiz, ancak orada çalışan sunucunun aslında URL'leri doğrudan dosya sistemine eşlediğini varsaymak için bir neden yoktur. Dürüst olmak gerekirse, bu cevabın neden bu kadar popüler olduğunu anlamıyorum, çünkü sorunun ne istediğini gerçekten nasıl yapacağını söylemiyor.
Sivri

75
@Pointy Geri kalanımızın Google için çalıştığı bir şeyi çözdüğü için olabilir
Ian Hunter

4
@cichy - bu dosyayı belleğe yüklüyor mu, yüklemiyor mu? Varlığını kontrol etmek istiyorum ama bir dosya yüklemiyorum.
Brian

11
Ana iş parçacığındaki zaman uyumlu XMLHttpRequest, son kullanıcının deneyimine zararlı etkileri nedeniyle kullanımdan kaldırılmıştır. Daha fazla yardım için xhr.spec.whatwg.org (Tarayıcıdan bu uyarı)
kupendra

71

Benzer ve daha güncel bir yaklaşım.

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

2
bu neden daha güncel? $.ajaxdaha geriye dönük uyumluysa daha iyi görünüyor, değil mi?
tim peterson

15
$ .ajax da çalışır, ancak başarı / hata / tam işlevler vaatler, yapılan / başarısız / her zaman yöntemler lehine reddedilir. hakkında daha fazla bilgiyi burada bulabilirsiniz api.jquery.com/jQuery.ajax . Buraya geldim çünkü sadece basit bir ilgiyle ilgileniyoruz, ancak bu sadece $ .ajax ({url: url, type: 'GET'}) için kısayol.
Matthew James Davis

4
Görüntü yoksa, konsol yankısı bir 404 hatasıdır. Uygulamamın her zaman bir resim olmamasını beklediği için bunu kaldırmanın bir yolu var mı ...
user1534664

1
Mümkün değil, bkz: stackoverflow.com/a/16379746/1981050 . Ancak, bu davranışınızı kesintiye uğratmamalıdır. Sadece bazı yabancı günlük kaydı verecektir.
Matthew James Davis

1
çapraz köken sorunları bununla ilgisiz
Matthew James Davis

69

Bu benim için çalışıyor:

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

2
Diğer bazı cevaplar işlevleri için daha iyi olsa da, bu cevabı aradığım şey olarak + 1'ledim. Unutmayın, önce içeriği yüklemezseniz daima sıfır alırsınız !. ie: window.addEventListener ('load', function () {
SpiRail

Aslında, pencere yükü ile bile hala sorunlarım vardı. Görüntü bir şekilde önbelleğe alınana kadar ölçülemez gibi görünüyor. Her neyse, sayfanın ilk kez yüklenmesinde benim için çalışmıyor. (yani: kullanıcı bu resmi daha önce hiç görmedi). Belki bir önceki sayfada görüntünüz varsa işinize
yarayabilir

3
Bunun nedeni görüntünün kaynağını ayarlaması ve HİÇBİR indirme işlemini henüz tamamlamayan görüntünün yüksekliğini görmek için HEMEN kontrol eder. Bunun çalışması için bir yükleyici işleyicisi eklemeniz gerekir. Bu tam da bu nedenle güvenilir bir yaklaşım değildir.
dudewad

Bunu gibi bir img.onload hanlder eklerseniz Neden güvenilir değildir stackoverflow.com/a/12355031/988591 ?
jj_

3
Soru bir resim değil bir dosya soruyor ! URL mevcutsa ve bir dosya değilse yüksekliği 0 olacaktır !!
Apostolos

44

alternatif resim eklemek için bu komut dosyasını kullandım

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
Harika - bilmiyordum. Bir görüntü yoksa bir kaydetme alternatifi ayarlamak için aşağıdakileri yapabilirsiniz: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Temmuz'da Ridcully

2
@Ridcully Ah, ama alternatif başarısız olursa? O zaman sonsuz bir döngü halindesiniz değil mi?
rvighne

Alternatif başarısız olursa, sunucu tarafında (veya programcı tarafında: P) daha yanlış bir şey olduğunu varsayalım
Erenor Paz

Sonsuz döngüyü önlemek için alt görüntüyü ayarlarken img etiketinin OnError'ını her zaman hiçbir şey olarak ayarlayabilirsiniz.
KingOfHypocrites

İyi iş efendim. Tıkır tıkır çalışıyor.
hiren

24

Aynı etki alanındaki dosyaları test ettiğiniz sürece bunun çalışması gerekir:

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

Bu örnekte, başlıkların alınmasının yanı sıra (dosyanın var olduğu hava durumunu kontrol etmek için ihtiyacınız olan tek şey) tüm dosyayı alan bir GET isteği kullanılıyor. Dosya yeterince büyükse, bu yöntemin tamamlanması biraz zaman alabilir.

Bunu yapmanın iyi bir yolu bu hattı değiştirerek olacaktır: req.open('GET', url, false);içinreq.open('HEAD', url, false);


5
Üzgünüz, bu kabul edilen cevapla aynıdır. Beni görmezden gel.
Moob

1
yardımcı olabilecek jQuery olmayan form hakkında biraz daha ayrıntı
tim peterson

@Moob, "kabul edilen cevapla etkili bir şekilde aynı değil", HEAD isteğinden çok farklı olan bir GET isteği gönderiyorsunuz.
YemSalat

async: false, Firefox sürüm 30.0 ve sonraki sürümlerde ve Chrome'un son / geçerli sürümlerinde senkronize işlem, olumsuz kullanıcı deneyimi nedeniyle kullanımdan kaldırılmıştır. Kullanılmaya çalışıldığında hata / hata oluşur. async: trueAsenkron çalışma için geri arama fonksiyonu ile kullanılmalıdır .
Kevin Fegan

Daha fazla JS yürütmeye devam etmeden önce lütfen bu yanıt için bekleyin? Teşekkür ederim.
vladanPro

16

Bu sorunun cevabını çalıştırmaya çalıştığımda bir etki alanları arası izin sorunu alıyordum:

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

Harika çalışıyor gibi görünüyor, umarım bu birine yardımcı olur!


3
Bence bu Boolean değerlerini kaybedecek çünkü UrlExists işlevinden değil, geri çağrılardan geri dönüyorlar.
mikebridge

bu işe yaramazsa, şunu okumalısınız: stackoverflow.com/questions/14220321/…
Hacketo

url nasıl görünüyor? , uzantısı olan veya olmayan?
151291

10

Babel transpiler veya Typescript 2 kullanıyorsanız ES7'nin nasıl yapılacağı aşağıda açıklanmıştır:

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

Daha sonra diğer asynckapsamınızın içinde, URL'nin var olup olmadığını kolayca kontrol edebilirsiniz:

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

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

5

Bir dosya olup olmadığını kontrol etmek için bu komut dosyasını kullanın (ayrıca çapraz kökenli sorunu ele alır):

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

Denetlenmekte olan dosya JSON içermiyorsa aşağıdaki sözdizimi hatasının atılacağını unutmayın.

Yakalanmayan Sözdizimi Hatası: Beklenmeyen simge <


3

Dosyanın var olup olmadığını görmek için zaman uyumsuz çağrı daha iyi bir yaklaşımdır, çünkü sunucudan bir yanıt bekleyerek kullanıcı deneyimini bozmaz. .openÜçüncü parametre false değerine ayarlanmış olarak bir çağrı yaparsanız (örneğin, birçok örnekte olduğu gibi http.open('HEAD', url, false);), bu senkronize bir çağrıdır ve tarayıcı konsolunda bir uyarı alırsınız.

Daha iyi bir yaklaşım:

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

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


Ayrıca, yöntem günlüğünüzle konsol günlüğüne bir uyarı yanıtı alıyorum, herhangi bir fikir?
Pierre

Eşzamansız olarak çağırdığından emin olmak .openiçin üçüncü parametre seti ile aramayı deneyin true, bunun gibi client.open("HEAD", address, true);@Pierre
Jim Bergman

2

İstemci bir bilgisayar için bu aşağıdakilerle gerçekleştirilebilir:

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

Bu, bir dosyayı belirli bir konuma aktarmak için kullanılan programım ve yoksa uyarı gösteriyor


1
FileSystemObject kullanacaksanız, FileExists () yöntemini kullanmak daha kolay görünüyor. msdn.microsoft.com/tr-tr/library/aa265024(v=vs.60).aspx
Mark F Guerra

2

Bir dosyanın var olup olmadığını kontrol etmek için JavaScript işlevi:

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

Önce işlevi oluşturur

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

Fonksiyonu aşağıdaki gibi kullandıktan sonra

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

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


Burada denedim ama işe yaramadı. Neyi kaçırdım?
Chetabahana

1

Bu, kabul edilen cevaba bir uyarlamadır, ancak cevaptan ihtiyacım olanı alamadım ve bunu bir önsöz gibi çalıştığını test etmek zorunda kaldım, bu yüzden çözümümü buraya koyuyorum.

Yerel bir dosyanın var olduğunu doğrulamamız ve yalnızca dosyanın (PDF) varsa açılmasına izin vermemiz gerekiyordu. Web sitesinin URL'sini atlarsanız, tarayıcı otomatik olarak ana bilgisayar adını belirler ve yerel ana bilgisayarda ve sunucuda çalışmasını sağlar:

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

Yapmanız gereken, kontrolü gerçekleştirmesi için sunucuya bir istek göndermek ve ardından sonucu size geri göndermektir.

Ne tür bir sunucuyla iletişim kurmaya çalışıyorsunuz? İsteği yanıtlamak için küçük bir hizmet yazmanız gerekebilir.


0

Bu OP'nin sorusunu ele almaz, ancak bir veritabanından sonuç döndüren herkes için: İşte kullandığım basit bir yöntem.

Kullanıcı bir avatar yüklemediyse avataralan olur NULL, bu yüzden dizinden varsayılan bir avatar resmi imgeklerdim.

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

sonra

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

0

Benim için çalışıyor, tarayıcıları yok saymak için iframe'i kullanın GET hata mesajını göster

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

0

Boole döndürecek bir işlev istedim, kapanma ve asenkroniklik ile ilgili sorunlarla karşılaştım. Bu şekilde çözdüm:

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);
},
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.