如何检查jQuery或纯JavaScript中是否存在文件?


Answers:


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
在纯JavaScript示例中,您应该OnReadyStateChange在检查HTTP_STATUS之前绑定事件。
罗伯特·皮特(RobertPitt)2010年

8
该示例代码是错误的,并且关于服务器上发生的一切没有任何说明。最初的问题很模糊,但是没有理由假设正在运行的服务器实际上将URL直接映射到文件系统。老实说,我不明白为什么这个答案如此受欢迎,因为它没有真正说出如何解决问题。
Pointy

75
@Pointy可能是因为它解决了我们其他人正在搜索的问题
Ian Hunter

4
@cichy-是否将文件加载到内存中?我想检查是否存在,但不加载文件。
布莱恩

11
不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。寻求更多帮助xhr.spec.whatwg.org(浏览器警告)
kupendra 2015年

71

一种类似且最新的方法。

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

2
为什么这是最新的?$.ajax如果它更向后兼容似乎更好了吧?
蒂姆·彼得森2013年

15
$ .ajax也可以使用,但是不赞成使用成功/错误/完成功能,而应使用诺言,完成/失败/总是使用方法。在api.jquery.com/jQuery.ajax上了解更多有关它的信息。我使用get的原因是因为我们只对简单的get感兴趣,但这只是$ .ajax({url:url,type:'GET'})的简写。
马修·詹姆斯·戴维斯

4
如果图像不存在,则控制台回显为404错误。有没有一种方法可以删除它,因为我的应用程序一直期望一个图像不存在...
user1534664

1
不可能,请参阅:stackoverflow.com/a/16379746/1981050。但是,这不应打断您的行为。它只会产生一些多余的日志记录。
马修·詹姆斯·戴维斯

1
跨源问题与此无关
Matthew James Davis

69

这对我有用:

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

2
虽然其他一些答案对他们的功能更好,但是我对这个答案+1,因为这正是我一直在寻找的东西。请记住,除非先加载内容,否则您总是会得到零!即:window.addEventListener('load',function(){
SpiRail 2012年

实际上,即使窗口加载,我仍然遇到问题。似乎无法测量图像,除非以某种方式对其进行缓存。无论如何,我不会在第一次加载页面时为我工作。(即:用户之前从未见过该图片)。如果您在前一页上有图像,这可能对您
有用

3
这是因为它设置了图像的来源,并且立即检查以查看尚未完成下载的图像的高度。您必须添加一个onload处理程序才能正常工作。出于确切的原因,这不是可靠的方法。
dudewad 2013年

如果添加像stackoverflow.com/a/12355031/988591这样的img.onload处理程序,为什么它不可靠?
jj_ 2014年

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啊,但是如果替代方法失败了怎么办?那你陷入无尽的循环吧?
rvighne 2014年

如果替代方法失败,我想服务器端(或程序员端:P)还有其他问题
Erenor Paz 2014年

设置alt图像时,可以始终将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 2012年

1
其有关非jQuery表单的更多详细信息可能会对您有所帮助
蒂姆·彼德森

@Moob,其“与接受的答案实际上没有相同”,您正在发送GET请求,该请求与HEAD请求不同。
YemSalat 2014年

async: false,Firefox 30.0及更高版本以及最近/当前版本的Chrome中的同步操作由于不利的用户体验而被弃用。尝试使用会导致失败/错误。应async: true与回调函数一起使用以进行异步操作。
凯文·费根

请在继续执行进一步的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

网址看起来如何?,具有扩展名或不具有扩展名?
151291 '16

10

如果您使用的是Babel transpiler或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时,将引发以下语法错误。

未捕获到的SyntaxError:意外令牌<


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/


我还会在控制台日志中使用您的方法收到警告响应,知道吗?
皮埃尔

尝试.open使用第三个参数集进行调用,true以确保它以异步方式调用它,例如client.open("HEAD", address, true);@Pierre
Jim Bergman,2010年

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/zh-CN/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);
},
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.