Bagaimana saya memeriksa apakah file ada di jQuery atau JavaScript murni?

259

Bagaimana cara saya memeriksa apakah file di server saya ada di jQuery atau JavaScript murni?

usertest
sumber

Jawaban:

433

Dengan jQuery:

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

EDIT:

Berikut adalah kode untuk memeriksa status 404, tanpa menggunakan jQuery

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

Perubahan kecil dan itu bisa memeriksa status kode status HTTP 200 (sukses), sebagai gantinya.

EDIT 2: Karena sinkronisasi XMLHttpRequest sudah usang, Anda dapat menambahkan metode utilitas seperti ini untuk melakukannya async:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
cichy
sumber
5
dalam contoh javascript murni Anda, Anda harus mengikat OnReadyStateChangeacara sebelum Anda memeriksa HTTP_STATUS.
RobertPitt
8
Contoh kode salah, dan tidak ada apa pun yang dikatakan tentang apa yang terjadi di server. Pertanyaan aslinya cukup samar, tetapi tidak ada alasan untuk berasumsi bahwa server yang sedang berjalan sebenarnya memetakan URL secara langsung ke sistem file. Jujur, saya tidak melihat mengapa jawaban ini sangat populer karena tidak benar-benar mengatakan bagaimana melakukan apa yang ditanyakan.
Runcing
75
@Pointy Bisa jadi karena itu menyelesaikan sesuatu yang kita semua cari di Google
Ian Hunter
4
@cichy - apakah ini memuat file ke dalam memori atau tidak? Saya mencari untuk memeriksa keberadaan tetapi tidak memuat file.
Brian
11
Sinkronisasi XMLHttpRequest pada utas utama sudah usang karena efeknya yang merugikan bagi pengalaman pengguna akhir. Untuk bantuan lebih lanjut xhr.spec.whatwg.org (Peringatan ini melalui browser)
kupendra
71

Pendekatan serupa dan lebih mutakhir.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Matthew James Davis
sumber
2
mengapa ini lebih up-to-date? $.ajaxtampaknya lebih baik jika lebih kompatibel ke belakang, kan?
tim peterson
15
$ .ajax berfungsi juga, tetapi fungsi sukses / kesalahan / lengkap tidak digunakan lagi karena janji, metode yang dilakukan / gagal / selalu. baca lebih lanjut di sini api.jquery.com/jQuery.ajax . Saya dulu menggunakan di sini karena kami hanya tertarik pada get sederhana, tetapi ini hanya singkatan untuk $ .ajax ({url: url, ketik: 'GET'}).
Matthew James Davis
4
Jika gambar tidak ada, konsol gema kesalahan 404. Apakah ada cara untuk menghapus ini, karena aplikasi saya selalu mengharapkan satu gambar tidak ada ...
user1534664
1
Tidak mungkin, lihat: stackoverflow.com/a/16379746/1981050 . Namun, ini seharusnya tidak mengganggu perilaku Anda. Itu hanya akan menghasilkan beberapa penebangan asing.
Matthew James Davis
1
masalah lintas asal tidak terkait dengan ini
Matthew James Davis
69

Ini bekerja untuk saya:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
Penguji
sumber
2
Sementara beberapa jawaban lain lebih baik untuk fungsinya, saya memberi +1 jawaban ini karena itulah yang saya cari. Ingat saja, Anda akan selalu mendapatkan nol kecuali jika Anda memuat konten terlebih dahulu !. yaitu: window.addEventListener ('load', function () {
SpiRail
Sebenarnya, saya masih memiliki masalah, bahkan dengan memuat jendela. Sepertinya gambar tidak dapat diukur sampai di-cache entah bagaimana. Lagi pula, saya tidak bekerja untuk saya pada pemuatan pertama kali halaman. (yaitu: pengguna belum pernah melihat gambar ini sebelumnya). Ini mungkin bekerja untuk Anda jika Anda memiliki gambar di halaman sebelumnya, mungkin ...
SpiRail
3
Itu karena ia menetapkan sumber gambar dan SEGERA memeriksa untuk melihat ketinggian gambar yang belum selesai diunduh. Anda harus menambahkan handler onload agar ini berfungsi. Ini bukan pendekatan yang andal karena alasan yang tepat.
dudewad
Mengapa tidak dapat diandalkan jika Anda menambahkan hanlder img.onload seperti begitu stackoverflow.com/a/12355031/988591 ?
jj_
3
Pertanyaannya adalah tentang file , bukan gambar! Jika URL benar-benar ada dan bukan file tingginya akan menjadi 0 !!
Apostolos
44

saya menggunakan skrip ini untuk menambahkan gambar alternatif

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

HTML:

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

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

Gino
sumber
24
Hebat - tidak tahu itu. Anda dapat melakukan yang berikut untuk menetapkan alternatif penyimpanan jika gambar tidak ada: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully
2
@ Sebenarnya Ah, tapi bagaimana jika alternatifnya gagal? Maka Anda berada dalam lingkaran tanpa akhir, kan?
rvighne
Jika alternatif gagal, saya kira ada sesuatu yang lebih salah di sisi server (atau di sisi programmer: P)
Erenor Paz
Anda selalu dapat mengatur OnError dari tag img menjadi nol saat mengatur gambar alt untuk mencegah loop tanpa akhir.
KingOfHypocrites
Kerja bagus Pak. Bekerja seperti pesona.
hiren
24

Selama Anda menguji file pada domain yang sama, ini akan berfungsi:

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

Harap perhatikan, contoh ini menggunakan permintaan GET, yang selain mendapatkan tajuk (semua yang Anda butuhkan untuk memeriksa cuaca ada file) mendapatkan seluruh file. Jika file cukup besar, metode ini dapat memakan waktu cukup lama untuk selesai.

Cara yang lebih baik untuk melakukan ini adalah mengubah baris ini: req.open('GET', url, false);menjadireq.open('HEAD', url, false);

Moob
sumber
5
Maaf, ini sama dengan jawaban yang diterima. Abaikan saya.
Moob
1
ini beberapa perincian lebih lanjut tentang formulir non-jQuery yang dapat membantu
tim peterson
@ Moo, ini bukan "secara efektif sama dengan jawaban yang diterima", Anda mengirim permintaan GET, yang jauh berbeda dengan permintaan HEAD.
YemSalat
async: false, operasi sinkron di Firefox versi 30.0 dan yang lebih baru, dan di Chrome versi terbaru / saat ini tidak digunakan lagi karena pengalaman pengguna yang tidak menguntungkan. Penggunaan yang diupayakan menyebabkan kegagalan / kesalahan. Harus digunakan async: truedengan fungsi panggilan balik untuk operasi asinkron.
Kevin Fegan
Harap tunggu jawaban ini sebelum melanjutkan untuk mengeksekusi JS lebih lanjut? Terima kasih.
vladanPro
16

Saya mendapatkan masalah izin lintas domain ketika mencoba menjalankan jawaban untuk pertanyaan ini, jadi saya menjawab:

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

Tampaknya bekerja dengan baik, semoga ini membantu seseorang!

Shaun
sumber
3
Saya pikir ini akan kehilangan nilai boolean karena mereka dikembalikan dari callback, bukan fungsi UrlExists.
mikebridge
ini tidak bisa, Anda harus membaca ini: stackoverflow.com/questions/14220321/...
Hacketo
bagaimana url terlihat? , dengan ekstensi atau tanpa ekstensi?
151291
10

Berikut ini cara melakukannya dengan cara ES7, jika Anda menggunakan Babel transpiler atau 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;
  }
}

Kemudian di dalam asyncruang lingkup Anda yang lain , Anda dapat dengan mudah memeriksa apakah url ada:

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

console.log(isValidUrl); // true || false
Nik Sumeiko
sumber
5

Saya menggunakan skrip ini untuk memeriksa apakah ada file (juga menangani masalah lintas asal):

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

Perhatikan bahwa kesalahan sintaks berikut dilemparkan ketika file yang diperiksa tidak mengandung JSON.

Uncaught SyntaxError: Token yang tidak terduga <

Gzimzim Musliaj
sumber
3

Panggilan async untuk melihat apakah ada file adalah pendekatan yang lebih baik, karena itu tidak menurunkan pengalaman pengguna dengan menunggu respons dari server. Jika Anda melakukan panggilan ke .opendengan parameter ketiga disetel ke false (seperti dalam banyak contoh di atas, misalnyahttp.open('HEAD', url, false); ), ini adalah panggilan sinkron, dan Anda mendapatkan peringatan di konsol browser.

Pendekatan yang lebih baik adalah:

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

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

Jim Bergman
sumber
Saya juga mendapatkan respons peringatan di log konsol dengan metode Anda, tahu?
Pierre
Coba panggil .opendengan set parameter ketiga trueuntuk memastikannya memanggilnya secara tidak sinkron, seperti client.open("HEAD", address, true);@Pierre ini
Jim Bergman
2

Untuk komputer klien ini dapat dicapai dengan:

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

Ini adalah program saya untuk mentransfer file ke lokasi tertentu dan menunjukkan peringatan jika tidak ada

yasir amin 9-b DR.VSMPS
sumber
1
Jika Anda akan menggunakan FileSystemObject tampaknya lebih mudah untuk menggunakan metode FileExists (). msdn.microsoft.com/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra
2

Fungsi JavaScript untuk memeriksa apakah ada file:

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;
    }
}
Ani Menon
sumber
1

Pertama menciptakan fungsi

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

Setelah menggunakan fungsi sebagai berikut

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

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

Vladimir Salguero
sumber
Saya mencoba di sini tetapi tidak berhasil. Apa yang saya lewatkan?
Chetabahana
1

Ini adalah adaptasi untuk jawaban yang diterima, tetapi saya tidak bisa mendapatkan apa yang saya butuhkan dari jawaban, dan harus menguji ini berhasil karena itu firasat, jadi saya meletakkan solusi saya di sini.

Kami perlu memverifikasi file lokal ada, dan hanya mengizinkan file (PDF) untuk membuka jika ada. Jika Anda menghilangkan URL situs web, browser akan secara otomatis menentukan nama host - membuatnya berfungsi di localhost dan di server:

$.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");

    }
});
Josh Harris
sumber
0

Yang harus Anda lakukan adalah mengirim permintaan ke server untuk melakukan pemeriksaan, dan kemudian mengirimkan kembali hasilnya kepada Anda.

Jenis server apa yang Anda coba untuk berkomunikasi? Anda mungkin perlu menulis layanan kecil untuk menanggapi permintaan.

MadcapLaugher
sumber
0

Ini tidak menjawab pertanyaan OP, tetapi bagi siapa saja yang mengembalikan hasil dari database: inilah metode sederhana yang saya gunakan.

Jika pengguna tidak mengunggah avatar, maka avatarbidangnya adalah NULL, jadi saya akan menyisipkan gambar avatar default dari imgdirektori.

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

kemudian

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

Ini berfungsi untuk saya, gunakan iframe untuk mengabaikan browser menampilkan pesan kesalahan GET

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

Saya menginginkan fungsi yang akan mengembalikan boolean, saya mengalami masalah terkait dengan penutupan dan asinkronisitas. Saya memecahkan masalah ini:

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);
},
Gianlorenzo Lenza
sumber