Проверить, существует ли изображение на сервере с использованием JavaScript?

Используя javascript, можно ли узнать, доступен ли ресурс на сервере? Например, у меня есть изображения 1.jpg - 5.jpg, загруженные в html-страницу. Я хотел бы вызывать функцию JavaScript каждую минуту или около того, чтобы примерно выполнить следующий рабочий код...

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

Мысли? Спасибо!

19 ответов

Решение

Вы можете использовать что-то вроде:

function imageExists(image_url){

    var http = new XMLHttpRequest();

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

    return http.status != 404;

}

Очевидно, что вы можете использовать jQuery/ Similar для выполнения вашего HTTP-запроса.

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

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

    })

Вы можете использовать базовый способ работы preloaders изображений, чтобы проверить, существует ли изображение.

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

Вы можете просто проверить, загружается изображение или нет, используя встроенные события, которые предусмотрены для всех изображений.

onload а также onerror События сообщат вам, успешно ли загружено изображение или произошла ошибка:

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

Лучший и современный подход - использовать 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 включен на сервере.

Если кто-то заходит на эту страницу, желая сделать это в клиенте на основе React, вы можете сделать что-то похожее на приведенное ниже, оригинал ответа, предоставленный Софией Альперт из команды React здесь

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

В основном обещанная версия ответов @espascarello и @adeneo с запасным параметром:

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

// Usage:

const link = checkImage(
  '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, даже если ваш файл не существует. Это, с другой стороны, сделает работу.

Если вы создаете тег изображения и добавляете его в DOM, его событие onload или onerror должно сработать. Если происходит ошибка, изображение не существует на сервере.

Вы можете вызвать эту функцию 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;
    }
}

Просто Promise функциональные версии ответов здесь с true/ false возвращаемое значение:

С участием img нагрузка:

Версии TypeScript:
      async function imageExists(imgUrl: string | null | undefined): Promise<boolean> {
  if (!imgUrl) {
    return false;
  }

  return new Promise(res => {
    const image = new Image();
    image.onload = () => res(true);
    image.onerror = () => res(false);
    image.src = imgUrl;
  });
}

async function fileExists(fileUrl: string | null | undefined): Promise<boolean> {
  if (!fileUrl) {
    return false;
  }

  return new Promise(res => {
    const http = new XMLHttpRequest();

    http.open('HEAD', fileUrl, false);
    http.send();
    http.onload = () => {
        res(http.status != 404);
    };
    http.onerror = () => {
        res(false);
    };

  });
}


async function fileExists(fileUrl: string | null | undefined): Promise<boolean>  {
  if (!fileUrl) {
    return false;
  }
  const res = await fetch(fileUrl, {
    method: 'HEAD',
  });

  return !!res.ok;
}

Вы можете сделать это с помощью ваших axios, установив относительный путь к соответствующей папке изображений. Я сделал это для получения файла JSON. Вы можете попробовать тот же метод для файла изображения, вы можете сослаться на эти примеры

Если вы уже установили экземпляр axios с baseurl в качестве сервера в другом домене, вам придется использовать полный путь статического файлового сервера, на котором вы развертываете веб-приложение.

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

Если изображение найдено, ответ будет 200, а если нет, то будет 404.

Кроме того, если файл изображения присутствует в папке assets внутри src, вы можете выполнить требование, получить путь и выполнить вышеуказанный вызов с этим путем.

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

У меня были некоторые проблемы с отображением изображения пользователя через JS, которое иногда могло отсутствовать.

Оказывается, вы можете сделать следующее в html, чтобы отобразить определенное изображение, когда загрузка изображения не удалась.

Просто хотел поделиться... Возможно, это сэкономит вам время!

Это отлично работает:

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

Это отлично работает, если вы хотите знать, находится ли изображение в папке

      function checkImage(var, extension){
  var image = new Image();
  var url_image = './folder/' + var + '.' + extension;
  image.src = url_image;
  if (image.width == 0) {
    return false;
  } else {
    return true;
  }
}

Если вы используете React, попробуйте этот пользовательский компонент изображения:

import React, { useRef } from 'react';
import PropTypes from 'prop-types';

import defaultErrorImage from 'assets/images/default-placeholder-image.png';

const Image = ({ src, alt, className, onErrorImage }) => {
  const imageEl = useRef(null);
  return (
    <img
      src={src}
      alt={alt}
      className={className}
      onError={() => {
        imageEl.current.src = onErrorImage;
      }}
      ref={imageEl}
    />
  );
};

Image.defaultProps = {
  onErrorImage: defaultErrorImage,
};

Image.propTypes = {
  src: PropTypes.string.isRequired,
  alt: PropTypes.string.isRequired,
  className: PropTypes.string.isRequired,
  onErrorImage: PropTypes.string,
};

export default Image;
      function checkImage(var){
  var image = new Image();
  var url_image = './folder/' + variable + '.jpg';
  image.src = url_image;
  if (image.width == 0) {
    return false;
  } else {
    return true;
  }
}

Это код работает для меня. Я обнаружил, что когда вы тестируете несколько изображений в массиве и хотите сразу вернуться, это не сработает.

Вам нужно дать браузеру некоторое время, чтобы загрузить изображение, иначе оно не будет работать.

Решения работают нормально:

Я нашел свое собственное решение: получить изображение и проверить статус ответа

      var path = "../folder/image.jpg";

fetch(path)
  .then(function(response) {
      if(response.status != 200){
            console.log("The image exists");
        }else{
            console.log("The image doesn't exist");
         }
     })

Простой эффективный, одна строка кода.

      var x = new XMLHttpRequest(); x.open("get", "your_url.com/image.ext or /image.png or image.jpg", true);x.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) {alert('exist');}else{alert('does not exist'};}; x.send();

Вы можете обратиться по этой ссылке, чтобы проверить, существует ли файл изображения с помощью 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'`;
    } } ```
Другие вопросы по тегам