jQuery 또는 순수 JavaScript에 파일이 있는지 어떻게 확인합니까?


259

서버의 파일이 jQuery 또는 순수 JavaScript로 존재하는지 어떻게 확인합니까?

답변:


433

jQuery로 :

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

편집하다:

다음은 jQuery를 사용하지 않고 404 상태를 확인하는 코드입니다.

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

5
순수 자바 스크립트 예제 OnReadyStateChange에서 HTTP_STATUS를 확인하기 전에 이벤트를 바인딩해야합니다 .
RobertPitt

8
예제 코드가 잘못되었으며 서버에서 무슨 일이 일어나고 있는지에 대한 언급은 없습니다. 원래 질문은 모호하지만, 실행중인 서버가 실제로 URL을 파일 시스템에 직접 매핑한다고 가정 할 이유가 없습니다. 솔직히, 나는이 답변이 왜 인기가 있는지 궁금하지 않습니다. 왜냐하면 질문이 요청한 것을 실제로 수행하는 방법을 말하지 않기 때문입니다.
Pointy

75
@Pointy 그것은 우리의 나머지 부분을 해결하기 때문에 가능합니다
Ian Hunter

4
@cichy-파일을 메모리에로드합니까? 존재 여부를 확인하려고하지만 파일을로드하지 않습니다.
Brian

11
기본 스레드의 동기 XMLHttpRequest는 최종 사용자의 경험에 해로운 영향으로 사용되지 않습니다. 더 도움말에 대한 xhr.spec.whatwg.org (브라우저에 의해이 경고)
kupendra

71

비슷하고 더 최신의 접근법.

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

2
왜 이것이 최신입니까? $.ajax이전 버전과의 호환성이 더 좋을 것 같습니다.
팀 피터슨

15
$ .ajax도 작동하지만 약속 / 완료 / 실패 / 항상 방법을 위해 성공 / 오류 / 완료 기능은 더 이상 사용되지 않습니다. 여기 api.jquery.com/jQuery.ajax 에 대해 자세히 알아 보십시오 . 우리는 단순한 get에만 관심이 있기 때문에 여기에 왔지만 $ .ajax ({url : url, type : 'GET'})의 줄임말입니다.
Matthew James Davis

4
이미지가 존재하지 않으면 콘솔 에코는 404 오류입니다. 내 응용 프로그램이 항상 하나의 이미지가 존재하지 않을 것으로 예상하기 때문에 이것을 제거하는 방법이 있습니까?
user1534664

1
불가능합니다. stackoverflow.com/a/16379746/1981050을 참조하십시오 . 그러나 이것은 당신의 행동을 방해해서는 안됩니다. 외부 로깅을 생성합니다.
Matthew James Davis

1
십자가의 기원 문제는이 관련이없는
매튜 제임스 데이비스

69

이것은 나를 위해 작동합니다 :

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

2
다른 답변이 그들의 기능에 더 좋지만, 내가 찾고있는 것이므로이 답변을 +1합니다. 내용을 먼저로드하지 않으면 항상 0이됩니다!. 즉 : window.addEventListener ( 'load', function () {
SpiRail

실제로, 나는 창로드에도 여전히 문제가있었습니다. 어떻게 든 캐시 될 때까지 이미지를 측정 할 수없는 것 같습니다. 어쨌든, 나는 처음 페이지를로드 할 때 나를 위해 일하지 않습니다. (예 : 사용자는이 이미지를 본 적이 없습니다). 이전 페이지에 이미지가있을 경우 효과가 있습니다.
SpiRail

3
이미지의 소스를 설정하고 즉시 다운로드가 완료되지 않은 이미지의 높이를 즉시 확인하기 때문입니다. 이것이 작동하려면 onload 핸들러를 추가해야합니다. 이것은 정확한 이유로 신뢰할 수있는 방법이 아닙니다.
dudewad

stackoverflow.com/a/12355031/988591 과 같은 img.onload hanlder를 추가하면 왜 신뢰할 수 없습니까?
jj_

3
질문은 이미지가 아니라 파일 에 대해 묻습니다 ! URL이 존재하고 파일이 아닌 경우 높이는 0입니다!
Apostolos

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
@Ridcully Ah, 그러나 대안이 실패하면 어떻게 될까요? 그럼 당신은 끝없는 루프에 있습니까?
rvighne

대안이 실패하면 서버 측 (또는 프로그래머 측 : P)에 더 잘못된 것이 있다고 가정합니다.
Erenor Paz

무한 루프를 방지하기 위해 대체 이미지를 설정할 때 항상 img 태그의 OnError를 없음으로 설정할 수 있습니다.
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);


5
죄송합니다. 이것은 실제로 허용되는 답변과 동일합니다. 나를 무시하십시오.
Moob

1
도움이 될 수있는 비 jQuery 형식에 대한 자세한 내용
tim peterson

@Moob은 "허용 된 답변과 사실상 동일하지 않습니다", HEAD 요청과는 다른 GET 요청을 보냅니다.
YemSalat

async: false, Firefox 버전 30.0 이상 및 최근 / 현재 버전의 Chrome에서는 동기식 작동이 좋지 않은 사용자 경험으로 인해 더 이상 사용되지 않습니다. 사용을 시도하면 실패 / 오류가 발생합니다. async: true비동기 작업을 위해 콜백 함수와 함께 사용해야 합니다.
Kevin Fegan

추가 JS를 계속 실행하기 전에 응답을 기다리십시오. 감사합니다.
vladanPro

16

이 질문에 대한 답변을 실행하려고 할 때 도메인 간 권한 문제가 발생하여 다음과 같이 진행했습니다.

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

그것은 잘 작동하는 것 같습니다, 이것이 누군가를 돕기를 바랍니다!


3
UrlExists 함수가 아닌 콜백에서 반환되기 때문에 이것이 부울 값을 잃을 것이라고 생각합니다.
mikebridge

이것은 작동하지 않습니다, 당신은 이것을 읽어야합니다 : stackoverflow.com/questions/14220321/…
Hacketo

URL은 어떻게 보입니까? 확장명 또는 확장명없이?
151291

10

Babel 트랜스 파일러 또는 Typescript 2를 사용하는 경우 ES7 방식으로 수행하는 방법은 다음과 같습니다.

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이 포함되어 있지 않으면 다음 구문 오류가 발생합니다.

잡히지 않은 구문 오류 : 예기치 않은 토큰 <


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/


나는 또한 당신의 방법으로 콘솔 로그에 경고 응답을 얻습니다.
Pierre

전화 시도 .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")
}

이 파일은 특정 위치로 파일을 전송하고 존재하지 않는 경우 경고를 표시하는 프로그램입니다.


1
FileSystemObject를 사용하려는 경우 FileExists () 메소드를 사용하는 것이 더 쉬운 것 같습니다. msdn.microsoft.com/ko-kr/library/aa265024(v=vs.60).aspx
Mark F Guerra

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


나는 여기에서 시도 했지만 작동시키지 못했습니다. 내가 잃어버린 것?
Chetabahana

1

이것은 받아 들인 대답에 대한 적응이지만 대답에서 필요한 것을 얻지 못했고 직감으로 작동했는지 테스트해야하므로 솔루션을 여기에 올려 놓았습니다.

로컬 파일이 존재하는지 확인하고 파일 (PDF)이있는 경우에만 파일을 열도록 허용해야했습니다. 웹 사이트의 URL을 생략하면 브라우저가 호스트 이름을 자동으로 결정하여 localhost 및 서버에서 작동하게합니다.

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

당신이해야 할 일은 확인을 수행하기 위해 서버에 요청을 보낸 다음 결과를 다시 보냅니다.

어떤 유형의 서버와 통신하려고합니까? 요청에 응답하기 위해 작은 서비스를 작성해야 할 수도 있습니다.


0

이것은 OP의 질문을 다루지는 않지만 데이터베이스에서 결과를 반환하는 사람에게는 다음과 같습니다. 여기 내가 사용한 간단한 방법이 있습니다.

사용자가 아바타를 업로드하지 않은 경우 avatar필드는입니다 NULL. 따라서 img디렉토리 에서 기본 아바타 이미지를 삽입합니다 .

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

그때

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

0

그것은 나를 위해 작동합니다, 브라우저를 무시하기 위해 iframe을 사용하십시오 .GET 오류 메시지를 표시하십시오.

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

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);
},
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.