JavaScript kullanarak sunucuda görüntü var mı kontrol edin?


124

Javascript kullanmak, sunucuda bir kaynak olup olmadığını anlamanın bir yolu var mı? Örneğin html sayfasına 1.jpg - 5.jpg resimleri yükledim. Her dakika bir JavaScript işlevi çağırmak istiyorum, bu kabaca aşağıdaki sıfırlama kodunu yapar ...

if "../imgs/6.jpg" exists:
    var nImg = document.createElement("img6");
    nImg.src = "../imgs/6.jpg";

Düşünceler? Teşekkürler!

Yanıtlar:


208

Şunun gibi bir şey kullanabilirsiniz:

function imageExists(image_url){

    var http = new XMLHttpRequest();

    http.open('HEAD', image_url, false);
    http.send();

    return http.status != 404;

}

Açıkçası, HTTP isteğinizi gerçekleştirmek için jQuery / benzerini kullanabilirsiniz.

$.get(image_url)
    .done(function() { 
        // Do something now you know the image exists.

    }).fail(function() { 
        // Image doesn't exist - do something else.

    })

4
Ancak, .js .css .html veya herkese açık başka bir dosyada çalıştığından, işlev adı fileExists olmamalıdır.
CoR

1
İşlev harika. Koleksiyonuma koydum :) Daha fileExistsiyi bir isim olacağını düşündüm çünkü bu fonksiyon sunucuda imaj olup olmadığını kontrol etmez. Dosyanın sunucudan erişilebilir olup olmadığını kontrol eder. Bu dosyanın gerçekten bir resim olup olmadığı kontrol edilemez. .Pdf, .html olabilir ve * .jpg veya * .png olarak yeniden adlandırılan rastgele bir dosya olabilir. Bir şey .jpg ile bitiyorsa, bu% 100 görüntü olduğu anlamına gelmez :)
CoR

9
Kaynağa CORS kuralları uyarınca erişime izin verilmediği sürece bu başarısız olur. Bir Imagenesneyi kullanmak bu sınırlamaya zarar vermez. Bunun tek avantajı, görüntüyü gerçekten indirmemesidir.
Alnitak

8
alanlar arası sorun.
Amit Kumar

2
Bu işe yarıyor, ancak isteği işleme koymanın daha uzun sürdüğünü ve en iyi çözüm olmadığını unutmayın. Ayrıca çapraz kaynak üzerinde çalışmaz (kesinlikle chrome'da), bu yüzden onu file: /// protokolünde kullanamazsınız, bu da yerel kullanım olmadığı anlamına gelir.
Cameron

118

Bir görüntünün var olup olmadığını test etmek için görüntü ön yükleyicilerin temel çalışma şeklini kullanabilirsiniz.

function checkImage(imageSrc, good, bad) {
    var img = new Image();
    img.onload = good; 
    img.onerror = bad;
    img.src = imageSrc;
}

checkImage("foo.gif", function(){ alert("good"); }, function(){ alert("bad"); } );

JSFiddle


Hey, harika fonksiyon! Bir yan not olarak, bu, sonuçları doğrudan anonim bir işleve döndürmenin ilginç bir yoludur. Bunu normalde return@ajtrichards'ın cevabının ilk bölümünde olduğu gibi bir ifade ile yapardım.
Sablefoste

Kesinlikle; ama diğer yolun senkron olduğunu hiç düşünmedim. Uzun bir prosedürel kodlama geçmişinden geliyorum ve bazen olaylara "diğer" bakış açısını özlüyorum ... Bahse girerim tek ben değilim. ;-)
Sablefoste

2
Gelecekteki Google çalışanları için bu çözümde sorun yaşıyorsa, img.src tanımını yeni Resim satırının hemen sonrasına taşımayı deneyin.
Gavin

52

Tüm görüntüler için sağlanan yerleşik olayları kullanarak görüntünün yüklenip yüklenmediğini kontrol edebilirsiniz.

onloadVe onerrorgörüntü başarıyla yüklendi veya eğer bir hata oluştu eğer olaylar söyleyecektir:

var image = new Image();

image.onload = function() {
    // image exists and is loaded
    document.body.appendChild(image);
}
image.onerror = function() {
    // image did not load

    var err = new Image();
    err.src = '/error.png';

    document.body.appendChild(err);
}

image.src = "../imgs/6.jpg";

2
Her durumda çalıştığı için benim için en iyi cevap (bağlantı sorunu, harici sunucu ...) +1
Reign. 85

2
Bu cevabın performansı AJAX.get alternatifiyle karşılaştırıldı. Bu cevap çok daha hızlı sonuç verir!
Samuel

Bu çözümü beğendim, yine de her iki durumda da bazı durumlarda sorunlara neden olabilecek olayları (eşzamansız yürütme) ortaya koyuyor: Her durumda görüntüyü eklemenizi ve sonra yalnızca hata durumunda değiştirmenizi öneririm.
Giorgio Tempesta

@adeno, Durum Kodu: 404 Bulunamadığı zaman çalışır mı
MahiMan

@Mahi - Durum kodu önemli olmamalı, 404 sayfası aslında geçerli bir resim döndürmediği sürece başarısız olur ve errorişleyiciyi tetikler .
adeneo

15

Herkes bunu isteyen bu sayfayı gelirse tepki tabanlı istemci, takıma tepki Sophia Alpert tarafından sağlanan bir cevap orijinal idi aşağıda gibi bir şey, yapabileceği burada

getInitialState: function(event) {
    return {image: "http://example.com/primary_image.jpg"};
},
handleError: function(event) {
    this.setState({image: "http://example.com/failover_image.jpg"});
},
render: function() {
    return (
        <img onError={this.handleError} src={src} />;
    );
}

7

Daha iyi ve modern bir yaklaşım, bir görüntünün var olup olmadığını kontrol etmek için ES6 Fetch API'sini kullanmaktır :

fetch('https://via.placeholder.com/150', { method: 'HEAD' })
    .then(res => {
        if (res.ok) {
            console.log('Image exists.');
        } else {
            console.log('Image does not exist.');
        }
    }).catch(err => console.log('Error:', err));

Aynı kaynaklı istekleri yaptığınızdan veya sunucuda CORS'nin etkinleştirildiğinden emin olun.


6

Bir resim etiketi oluşturur ve bunu DOM'a eklerseniz, ya onload ya da onerror olayı tetiklenmelidir. Bir hata oluşursa, görüntü sunucuda mevcut değildir.


3

Dosyanın Sunucuda mevcut olup olmadığını kontrol etmek için bu JS işlevini çağırabilirsiniz:

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
İyi çaba. ancak tek formda birden çok görüntü yüklerken biraz zaman alır.
Nuwan Withanage

url yoksa xhr.send () adresindeki hatayı gösterir.
Avinash Sharma

3

Temel olarak, @ espascarello ve @adeneo'nun bir geri dönüş parametresi ile yanıt veren bir sürümü:

const getImageOrFallback = (path, fallback) => {
  return new Promise(resolve => {
    const img = new Image();
    img.src = path;
    img.onload = () => resolve(path);
    img.onerror = () => resolve(fallback);
  });
};

// Usage:

const link = getImageOrFallback(
  'https://www.fillmurray.com/640/360',
  'https://via.placeholder.com/150'
  ).then(result => console.log(result) || result)

// It can be also implemented using the async / await API.

Not: Kişisel olarak fetchçözümü daha çok beğenebilirim , ancak bir dezavantajı var - sunucunuz belirli bir şekilde yapılandırılmışsa, dosyanız olmasa bile 200/304 döndürebilir. Öte yandan, bu işi yapacak.


2
Bunun için fetch, isteğin başarılı olup olmadığını kontrol etmek okiçin responsenesnenin özelliğini kullanabilirsiniz : fetch(url).then(res => {if(res.ok){ /*exist*/} else {/*not exist*/}});
attacomsian

Geçerli arka plan resmini kontrol etmek istersem, bu maalesef benim için çalışmıyor. background-image: url('/a/broken/url')bana 200ve ok(Chrome 74) verir.
HynekS

2

Bunu, ilgili görüntüler klasörüne göreceli yol ayarlayarak aksiyolarınızla yapabilirsiniz. Bunu bir json dosyası almak için yaptım. Bir görüntü dosyası için aynı yöntemi deneyebilirsiniz, bu örneklere başvurabilirsiniz

Baseurl ile bir axios örneğini farklı etki alanında sunucu olarak zaten ayarladıysanız, web uygulamasını dağıttığınız statik dosya sunucusunun tam yolunu kullanmanız gerekecektir.

  axios.get('http://localhost:3000/assets/samplepic.png').then((response) => {
            console.log(response)
        }).catch((error) => {
            console.log(error)
        })

Görüntü bulunursa yanıt 200, yoksa 404 olacaktır.

Ayrıca, görüntü dosyası src içindeki varlıklar klasöründe mevcutsa, bir talepte bulunabilir, yolu alabilir ve bu yolla yukarıdaki çağrıyı yapabilirsiniz.

var SampleImagePath = require('./assets/samplepic.png');
axios.get(SampleImagePath).then(...)

0

Bu iyi çalışıyor:

function checkImage(imageSrc) {
    var img = new Image();        
    try {
        img.src = imageSrc;
        return true;
    } catch(err) {
        return false;
    }    
}

12
Bunun her seferinde doğru döndüğünden oldukça emin misiniz?
Brandon McAlees

-3

JavaScript içeren bir resim dosyası olup olmadığını kontrol etmek için bu bağlantıya başvurabilirsiniz .

checkImageExist.js:

    var image = new Image();
    var url_image = './ImageFolder/' + variable + '.jpg';
    image.src = url_image;
    if (image.width == 0) {
       return `<img src='./ImageFolder/defaultImage.jpg'>`;
    } else {
       return `<img src='./ImageFolder/`+variable+`.jpg'`;
    } } ```

1
Bunu daha yeni test ettim. Çalışmıyor . Her zaman varsayılan görüntüyü döndürür. (Muhtemelen tarayıcının genişliğini test etmeye çalışmadan önce HTTP isteğinde bulunması ve görüntüyü yüklemesi için zaman olmadığı için).
Quentin
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.