Làm cách nào để kiểm tra xem tệp có tồn tại trong jQuery hoặc JavaScript thuần không?


Câu trả lời:


433

Với jQuery:

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

BIÊN TẬP:

Đây là mã để kiểm tra trạng thái 404 mà không cần sử dụng jQuery

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

Thay đổi nhỏ và thay vào đó, nó có thể kiểm tra trạng thái mã trạng thái HTTP 200 (thành công).

EDIT 2: Vì XMLHttpRequest không được đồng bộ hóa, bạn có thể thêm một phương thức tiện ích như thế này để thực hiện async:

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

5
trong ví dụ javascript thuần túy của bạn, bạn nên ràng buộc OnReadyStateChangesự kiện trước khi bạn kiểm tra HTTP_STATUS.
RobertPitt

8
Mã ví dụ là sai, và không có bất cứ điều gì nói về những gì đang xảy ra ở máy chủ. Câu hỏi ban đầu khá mơ hồ, nhưng không có lý do gì để cho rằng máy chủ đang chạy trên thực tế có ánh xạ URL trực tiếp đến hệ thống tệp. Thành thật mà nói, tôi không thấy lý do tại sao câu trả lời này lại phổ biến đến vậy vì nó không thực sự nói làm thế nào để làm những gì câu hỏi yêu cầu.
Mũi nhọn

75
@Pointy Có thể là vì nó giải quyết một cái gì đó mà phần còn lại của chúng tôi là Googling cho
Ian Hunter

4
@cichy - cái này có tải tập tin vào bộ nhớ hay không? Tôi đang tìm cách kiểm tra sự tồn tại nhưng không tải một tập tin.
Brian

11
XMLHttpRequest đồng bộ trên luồng chính bị phản đối vì những tác động bất lợi của nó đối với trải nghiệm của người dùng cuối. Để được trợ giúp thêm xhr.spec.whatwg.org (Cảnh báo này của trình duyệt)
kupendra

71

Một cách tiếp cận tương tự và cập nhật hơn.

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

2
Tại sao điều này cập nhật hơn? $.ajaxCó vẻ tốt hơn nếu nó tương thích ngược hơn, phải không?
tim peterson

15
$ .ajax cũng hoạt động, nhưng các hàm thành công / lỗi / hoàn thành không được chấp nhận theo các lời hứa, các phương thức thực hiện / thất bại / luôn luôn. đọc thêm về nó ở đây api.jquery.com/jQuery.ajax . Tôi đã sử dụng get ở đây vì chúng tôi chỉ quan tâm đến một get đơn giản, nhưng đây chỉ là viết tắt của $ .ajax ({url: url, gõ: 'GET'}).
Matthew James Davis

4
Nếu hình ảnh không tồn tại, bảng điều khiển sẽ báo lỗi 404. Có cách nào để loại bỏ điều này không, vì ứng dụng của tôi luôn mong muốn một hình ảnh không tồn tại ...
user1534664

1
Không thể, xem: stackoverflow.com/a/16379746/1981050 . Tuy nhiên, điều này không nên làm gián đoạn hành vi của bạn. Nó sẽ chỉ mang lại một số đăng nhập ngoại lai.
Matthew James Davis

1
vấn đề nguồn gốc chéo không liên quan đến điều này
Matthew James Davis

69

Điều này làm việc cho tôi:

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

2
Trong khi một số câu trả lời khác tốt hơn cho chức năng của họ, tôi +1 câu trả lời này vì đó là những gì tôi đang tìm kiếm. Chỉ cần nhớ, bạn sẽ luôn nhận được số không trừ khi bạn tải nội dung trước!. tức là: window.addEventListener ('load', function () {
SpiRail

Trên thực tế, tôi vẫn có vấn đề, ngay cả với tải cửa sổ. Có vẻ như hình ảnh không thể được đo cho đến khi nó được lưu trữ bằng cách nào đó. Dù sao, tôi không làm việc cho tôi trong lần tải trang đầu tiên. (tức là: người dùng chưa bao giờ nhìn thấy hình ảnh này trước đây). Nó có thể phù hợp với bạn nếu bạn có hình ảnh trên trang trước, có thể ...
SpiRail

3
Đó là bởi vì nó đặt nguồn của hình ảnh và NGAY LẬP TỨC để xem chiều cao của hình ảnh chưa tải xuống xong. Bạn sẽ phải thêm một trình xử lý tải để làm việc này. Đây không phải là một cách tiếp cận đáng tin cậy cho lý do chính xác đó.
dudewad

Tại sao nó không đáng tin cậy nếu bạn thêm một hanlder img.onload như vậy stackoverflow.com/a/12355031/988591 ?
jj_

3
Câu hỏi hỏi về một tập tin , không phải một hình ảnh! Nếu URL tồn tại và không phải là tệp thì chiều cao của nó sẽ là 0 !!
Tông đồ

44

tôi đã sử dụng kịch bản này để thêm hình ảnh thay thế

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
Tuyệt vời - không biết điều đó. Bạn có thể thực hiện các thao tác sau để đặt thay thế lưu nếu hình ảnh không tồn tại: <img src = "image.gif" onerror = "this.src = 'Alternative.gif'">
Ridcully

2
@Ridcully Ah, nhưng nếu thay thế thất bại thì sao? Sau đó, bạn đang ở trong một vòng lặp vô tận phải không?
rvighne

Nếu thay thế thất bại, tôi cho rằng có một cái gì đó sai hơn ở phía máy chủ (hoặc về phía lập trình viên: P)
Erenor Paz

Bạn luôn có thể đặt OnError của thẻ img thành không có gì khi đặt hình ảnh alt để ngăn vòng lặp vô tận.
KingOfHypocites

Làm tốt lắm ngài. Hoạt động như một lá bùa.
hiren

24

Miễn là bạn đang kiểm tra các tệp trên cùng một tên miền thì điều này sẽ hoạt động:

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

Xin lưu ý, ví dụ này đang sử dụng yêu cầu GET, ngoài việc nhận các tiêu đề (tất cả những gì bạn cần để kiểm tra thời tiết tệp tồn tại) sẽ nhận được toàn bộ tệp. Nếu tệp đủ lớn, phương pháp này có thể mất một lúc để hoàn thành.

Cách tốt hơn để làm điều này sẽ được thay đổi dòng này: req.open('GET', url, false);đểreq.open('HEAD', url, false);


5
Xin lỗi, đây thực sự giống như câu trả lời được chấp nhận. Phớt lờ tôi.
Moob

1
một số chi tiết khác về biểu mẫu không phải là jQuery có thể hữu ích
tim peterson

@Moob, nó không "thực sự giống như câu trả lời được chấp nhận", bạn đang gửi một yêu cầu GET, khác với yêu cầu CHÍNH.
YemSalat

async: false, hoạt động đồng bộ trong Firefox phiên bản 30.0 trở lên và trong các phiên bản Chrome gần đây / hiện tại không được dùng nữa do trải nghiệm người dùng không thuận lợi. Đã cố sử dụng kết quả trong thất bại / lỗi. Nên sử dụng async: truevới chức năng gọi lại cho hoạt động không đồng bộ.
Kevin Fegan

Xin vui lòng chờ phản hồi này trước khi tiếp tục thực hiện thêm JS? Cảm ơn bạn.
vladanPro

16

Tôi đã gặp vấn đề về quyền truy cập tên miền chéo khi cố gắng chạy câu trả lời cho câu hỏi này vì vậy tôi đã sử dụng:

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

Nó dường như làm việc tuyệt vời, hy vọng điều này sẽ giúp ai đó!


3
Tôi nghĩ rằng điều này sẽ mất các giá trị boolean bởi vì chúng được trả về từ các cuộc gọi lại, không phải hàm UrlExists.
mikebridge

điều này có thể không làm việc, bạn nên đọc này: stackoverflow.com/questions/14220321/...
Hacketo

url trông như thế nào? , có phần mở rộng hay không có phần mở rộng?
151291

10

Đây là cách thực hiện theo cách ES7, nếu bạn đang sử dụng bộ chuyển mã Babel hoặc Bản mô tả 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;
  }
}

Sau đó, trong asyncphạm vi khác của bạn , bạn có thể dễ dàng kiểm tra xem url có tồn tại hay không:

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

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

5

Tôi sử dụng tập lệnh này để kiểm tra xem một tập tin có tồn tại không (nó cũng xử lý vấn đề nguồn gốc chéo):

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

Lưu ý rằng lỗi cú pháp sau được đưa ra khi tệp đang được kiểm tra không chứa JSON.

Uncaught SyntaxError: Mã thông báo bất ngờ <


3

Một cuộc gọi không đồng bộ để xem nếu một tệp tồn tại là cách tiếp cận tốt hơn, bởi vì nó không làm giảm trải nghiệm người dùng bằng cách chờ phản hồi từ máy chủ. Nếu bạn thực hiện cuộc gọi .openvới tham số thứ ba được đặt thành false (ví dụ như trong nhiều ví dụ ở trên http.open('HEAD', url, false);), đây là cuộc gọi đồng bộ và bạn nhận được cảnh báo trong bảng điều khiển trình duyệt.

Một cách tiếp cận tốt hơn là:

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

nguồn: https://xhr.spec.whatwg.org/


Tôi cũng nhận được một phản hồi cảnh báo trong nhật ký giao diện điều khiển với phương pháp của bạn, ý tưởng nào?
Pierre

Hãy thử gọi .openvới tham số thứ ba được đặt để trueđảm bảo nó gọi nó không đồng bộ, như thế này client.open("HEAD", address, true);@Pierre
Jim Bergman

2

Đối với một máy tính khách, điều này có thể đạt được bằng cách:

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

Đây là chương trình của tôi để chuyển một tệp đến một vị trí cụ thể và hiển thị cảnh báo nếu nó không tồn tại


1
Nếu bạn định sử dụng FileSystemObject, có vẻ dễ sử dụng phương thức FileExists () hơn. msdn.microsoft.com/en-us/l Library / aa265024 (v = vs.60) .aspx
Mark F Guerra

2

Hàm JavaScript để kiểm tra nếu một tệp tồn tại:

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

Đầu tiên tạo hàm

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

Sau khi sử dụng chức năng như sau

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

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


Tôi đã thử ở đây nhưng không thể làm cho nó hoạt động. Những gì tôi đã bị mất?
Chetabahana

1

Đây là một sự thích ứng với câu trả lời được chấp nhận, nhưng tôi không thể có được những gì tôi cần từ câu trả lời, và phải kiểm tra nó hoạt động vì nó là một linh cảm, vì vậy tôi đang đưa giải pháp của mình lên đây.

Chúng tôi cần xác minh một tệp cục bộ tồn tại và chỉ cho phép tệp (PDF) mở nếu nó tồn tại. Nếu bạn bỏ qua URL của trang web, trình duyệt sẽ tự động xác định tên máy chủ - làm cho nó hoạt động trong localhost và trên máy chủ:

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

Những gì bạn phải làm là gửi yêu cầu đến máy chủ để thực hiện kiểm tra, sau đó gửi lại kết quả cho bạn.

Bạn đang cố gắng liên lạc với loại máy chủ nào? Bạn có thể cần phải viết một dịch vụ nhỏ để đáp ứng yêu cầu.


0

Điều này không giải quyết câu hỏi của OP, nhưng đối với bất kỳ ai trả về kết quả từ cơ sở dữ liệu: đây là một phương pháp đơn giản tôi đã sử dụng.

Nếu người dùng không tải lên hình đại diện thì avatartrường sẽ là NULLvậy, vì vậy tôi sẽ chèn hình ảnh đại diện mặc định từ imgthư mục.

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

sau đó

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

0

Nó hoạt động với tôi, sử dụng iframe để bỏ qua các trình duyệt hiển thị thông báo lỗi GET

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

0

Tôi muốn một hàm sẽ trả về boolean, tôi gặp phải các vấn đề liên quan đến đóng cửa và không điển hình. Tôi đã giải quyết theo cách này:

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);
},
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.