JavaScript를 사용하는 서버에 이미지가 있는지 확인하십시오.


124

자바 스크립트를 사용하면 서버에서 리소스를 사용할 수 있는지 알 수있는 방법이 있습니까? 예를 들어 1.jpg-5.jpg 이미지가 html 페이지에로드되었습니다. 매분마다 JavaScript 함수를 호출하여 대략 다음 스크래치 코드를 수행하고 싶습니다.

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

생각? 감사!

답변:


208

다음과 같이 사용할 수 있습니다.

function imageExists(image_url){

    var http = new XMLHttpRequest();

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

    return http.status != 404;

}

분명히 HTTP 요청을 수행하기 위해 jQuery / similar를 사용할 수 있습니다.

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

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

    })

4
그러나 .js .css .html 또는 기타 공개적으로 사용 가능한 파일에서 작동하므로 함수 이름이 fileExists이면 안됩니다.
CoR

1
기능은 굉장합니다. 나는 그것을 내 컬렉션에 넣었다 :) fileExists이 기능은 이미지가 서버에 있는지 확인하지 않기 때문에 더 나은 이름이 될 것이라고 생각했습니다 . 서버에서 파일에 액세스 할 수 있는지 확인합니다. 해당 파일이 실제로 이미지인지 확인하지 않습니다. .pdf, .html, * .jpg 또는 * .png로 이름이 변경된 임의의 파일 일 수 있습니다. .JPG 뭔가의 끝은 그것의 100 % 이미지 : 의미하지 않는 경우
고전

9
CORS 규칙에 따라 리소스 액세스가 허용되지 않으면 실패합니다. Image객체를 사용하는 것은 그 제한을 겪지 않습니다. 이것의 유일한 장점은 실제로 이미지를 다운로드하지 않는다는 것입니다.
Alnitak

8
교차 도메인 문제.
Amit Kumar

2
이것은 효과가 있지만 요청을 처리하는 데 시간이 더 오래 걸리며 최상의 솔루션이 아닙니다. 또한 교차 출처 (크롬에서 확실히)에서 작동하지 않으므로 file : /// 프로토콜에서 사용할 수 없으므로 로컬 사용이 없습니다.
Cameron

118

이미지 프리 로더의 기본 작동 방식을 사용하여 이미지가 있는지 테스트 할 수 있습니다.

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


이봐, 멋진 기능! 참고로 이것은 결과를 익명 함수로 직접 반환하는 흥미로운 방법입니다. 나는 일반적으로 return@ajtrichards가 그의 대답의 첫 부분에있는 것과 같은 진술로 이것을 할 것 입니다.
Sablefoste

물론; 하지만 다른 방법은 동기식이라고 생각하지 않았습니다. 나는 절차 적 코딩의 오랜 역사에서 왔고, 때때로 사물을 보는 "다른"방식을 그리워한다. 내가 유일한 사람은 아닐 것이다. ;-)
Sablefoste

2
이 솔루션에 문제가있는 향후 Google 사용자를 위해 img.src 정의를 새 이미지 줄 바로 다음으로 이동해보세요.
Gavin

52

모든 이미지에 제공되는 기본 제공 이벤트를 사용하여 이미지가로드되는지 여부를 확인할 수 있습니다.

onloadonerror이미지가 성공적으로로드하는 경우 또는 오류가 발생하면 이벤트가 당신을 말할 것이다 :

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
저에게 가장 좋은 대답은 모든 경우에서 작동하므로 (연결 문제, 외부 서버 ...) +1
Reign.85

2
이 답변의 성능을 AJAX.get 대안과 비교했습니다. 이 답변은 훨씬 빠르게 수행됩니다!
Samuel

이 솔루션이 마음에 들지만 두 경우 모두 (비동기 실행) 이벤트를 도입하여 상황에 따라 문제를 일으킬 수 있습니다. 어떤 경우에도 이미지를 추가 한 다음 오류가 발생한 경우에만 대체하는 것이 좋습니다.
Giorgio Tempesta

404 찾을 수 없음 : @adeno,이 상태 코드는 때 작동합니까
MahiMan

@Mahi-상태 코드는 중요하지 않습니다. 404 페이지가 실제로 유효한 이미지를 반환하지 않는 한, 실패하고 error핸들러를 트리거 합니다.
adeneo

15

사람이이이 작업을 수행하고자하는이 페이지에 오는 경우 반작용 기반 클라이언트를, 당신은 팀 반응의 소피아 알퍼트가 제공하는 응답 원래 있던 다음과 같이 수행 할 수 여기를

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

더 좋고 현대적인 접근 방식은 ES6 Fetch API 를 사용 하여 이미지가 있는지 여부를 확인하는 것입니다.

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

동일한 출처 요청을하고 있는지 또는 서버에서 CORS가 활성화되어 있는지 확인하십시오.


6

이미지 태그를 만들어 DOM에 추가하면 onload 또는 onerror 이벤트가 실행됩니다. onerror가 발생하면 이미지가 서버에 존재하지 않습니다.


3

이 JS 함수를 호출하여 파일이 서버에 있는지 확인할 수 있습니다.

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
잘하셨습니다. 그러나 단일 형식으로 여러 이미지를로드 할 때 약간의 시간이 걸립니다.
Nuwan Withanage

URL이 존재하지 않으면 xhr.send ()에 오류가 표시됩니다.
Avinash Sharma

3

기본적 으로 @espascarello 및 @adeneo 답변 의 약속 된 버전이며 fallback 매개 변수가 있습니다.

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.

참고 : 개인적으로 fetch솔루션이 더 마음에들 수도 있지만 단점이 있습니다. 서버가 특정 방식으로 구성되면 파일이 존재하지 않더라도 200/304를 반환 할 수 있습니다. 반면에 이것은 일을 할 것입니다.


2
를 들어 fetch, 당신이 사용할 수 ok의 특성 response: 객체를 요청의 성공 여부 확인 fetch(url).then(res => {if(res.ok){ /*exist*/} else {/*not exist*/}});
attacomsian

유감스럽게도 유효한 배경 이미지를 확인하려면 작동하지 않습니다. background-image: url('/a/broken/url')나에게 제공 200하고 ok(크롬 74).
HynekS

2

해당 이미지 폴더의 상대 경로를 설정하여 axios로이를 수행 할 수 있습니다. 나는 json 파일을 얻기 위해 이것을했다. 이미지 파일에 대해 동일한 방법을 시도 할 수 있으며 다음 예제를 참조 할 수 있습니다.

baseurl이있는 axios 인스턴스를 다른 도메인의 서버로 이미 설정 한 경우 웹 애플리케이션을 배포하는 정적 파일 서버의 전체 경로를 사용해야합니다.

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

이미지가 발견되면 응답은 200이되고 그렇지 않으면 404가됩니다.

또한 이미지 파일이 src 내부의 assets 폴더에 있으면 요청을 수행하고 경로를 가져와 해당 경로로 위의 호출을 수행 할 수 있습니다.

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

0

이것은 잘 작동합니다.

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

12
이것이 매번 사실을 반환한다고 확신합니까?
Brandon McAlees

-3

이 링크 를 참조 하여 이미지 파일이 JavaScript로 존재하는지 확인할 수 있습니다 .

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
방금 테스트했습니다. 작동하지 않습니다 . 항상 기본 이미지를 반환합니다. (아마도 브라우저가 HTTP 요청을하고 너비를 테스트하기 전에 이미지를로드 할 시간이 없기 때문일 것입니다).
Quentin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.