使用 JavaScript 检查服务器上是否存在图像?

IT技术 javascript
2021-02-02 01:02:26

使用 javascript 有没有办法判断服务器上的资源是否可用?例如,我将图像 1.jpg - 5.jpg 加载到 html 页面中。我想每分钟左右调用一次 JavaScript 函数,大致执行以下临时代码...

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

想法?谢谢!

6个回答

你可以使用类似的东西:

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.

    })
这确实有效,但请记住,处理请求需要更长的时间,并且不是最佳解决方案。它也不适用于跨源(肯定在 chrome 中),因此您不能在 file:/// 协议上使用它,这意味着没有本地使用。
2021-03-11 01:02:26
除非根据 CORS 规则允许访问资源,否则这将失败。使用Image对象不会受到这种限制。这样做的唯一优点是它实际上不会下载图像。
2021-03-20 01:02:26
跨域问题。
2021-03-29 01:02:26
功能很棒。我把它放在我的收藏中 :) 我认为fileExists这个名字会更好,因为这个函数不检查服务器上是否存在图像。它检查文件是否可以从服务器访问。没有检查该文件是否实际上是图像。它可能是 .pdf、.html、一些重命名为 *.jpg 或 *.png 的随机文件。如果某些内容以 .jpg 结尾,这并不意味着它是 100% 图像:)
2021-04-05 01:02:26
但是函数名称不应该是 fileExists,因为这适用于 .js .css .html 或任何其他公开可用的文件。
2021-04-09 01:02:26

您可以使用图像预加载器的基本工作方式来测试图像是否存在。

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

@gvlasov 所以如果是这种情况,您必须执行头部请求并查看响应。2013 年的一个问题中的一个选项......
2021-03-18 01:02:26
嘿,很酷的功能!附带说明一下,这是一种有趣的返回结果的方式,直接返回到匿名函数中。我通常会用return@ajtrichards 在他的回答的第一部分中这样的声明来做到这一点
2021-03-20 01:02:26
对于未来遇到此解决方案问题的 googlers,尝试将 img.src 定义移动到新的 Image 行之后。
2021-03-25 01:02:26
绝对地; 但我从未真正考虑过同步的另一种方式。我来自程序编码的悠久历史,有时会错过看待事物的“另一种”方式......我敢打赌我不是唯一的人。;-)
2021-03-28 01:02:26
如果图像服务器返回带有实际图像内容的 404,这将无助于捕获 404 错误,例如 Youtube 缩略图服务所做的:i3.ytimg.com/vi/vGc4mg5pul4/maxresdefault.jpg
2021-03-31 01:02:26

您可以使用为所有图像提供的内置事件来检查图像是否加载。

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";
将此答案的性能与 AJAX.get 替代方案进行比较。这个答案的执行速度要快得多!
2021-03-24 01:02:26
@Mahi - 状态代码应该无关紧要,只要 404 页面实际上没有返回有效图像,它就会失败并触发error处理程序。
2021-03-24 01:02:26
对我来说最好的答案,因为它适用于所有情况(连接问题,外部服务器......)+1
2021-04-02 01:02:26
@adeno,当状态代码:404 Not Found 时是否有效
2021-04-03 01:02:26
我喜欢这个解决方案,无论如何它在两种情况下都引入了事件(异步执行),这在某些情况下可能会导致问题:我建议在任何情况下附加图像,然后仅在出现错误的情况下替换它。
2021-04-04 01:02:26

一种更好的现代方法是使用 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。

这难以置信。这是什么时候出现的?
2021-03-13 01:02:26
2020 年最简单的方法。谢谢。
2021-03-27 01:02:26
@KyleBaker Fetch API 可用很长时间。它现在得到所有现代浏览器的广泛支持——几乎达到 95%。
2021-03-31 01:02:26

如果有人来到此页面希望在基于React的客户端中执行此操作,您可以执行以下操作,这是 React 团队的 Sophia Alpert 在此处提供的原始答案

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