使用Ajax和jQuery检查文件是否存在 - 始终返回200响应

时间:2011-09-19 15:31:44

标签: javascript jquery ajax

所以我需要在向客户端显示特定数据之前检查文件是否存在...使用jQuery我有这个:

<script>
function fileExists(fileLocation) {
    var response = $.ajax({
        url: fileLocation,
        type: 'HEAD',
        async: false
    }).status;
    alert(response);
}
</script>

当我尝试运行该功能时:

<script> fileExists('http://www.example.com/123.jpg'); </script>

(其中example.com是我的域名),我总是会收到200个响应代码。我想知道为什么会发生这种情况 - 是不是我通过.htaccess设置了自定义错误页面?或者,有没有更好的方法来做到这一点?

注意:正在使用jQuery 1.5.1。

更新:它似乎被定向到我们通过.htaccess设置的自定义错误页面:

ErrorDocument 404 http://www.example.com/errors/notfound.php

不确定这是否会导致冲突,或者如何解决冲突。

解决

我检查了自定义404页面的标题,它返回了200个响应代码。必须硬编码标题:

<?php header('HTTP/1.1 404 Not Found'); ?>

然后会返回404响应代码 - 修复我的问题。

4 个答案:

答案 0 :(得分:11)

为什么不与回调success and error异步实现这一点?

$.ajax({
   type: 'HEAD',
   url: fileLocation,
   success: function(msg){
     alert(msg);
   },
   error: function(jqXHR, textStatus, errorThrown){
     log(jqXHR);
     log(errorThrown);

   }
 });

答案 1 :(得分:8)

我的发布似乎存在于我的自定义404页面,该页面返回了200状态代码。我不得不使用php header()函数对404响应代码进行硬编码,这解决了我遇到的问题。现在,如果页面不存在,则表示正确:

使用一种简单的方法来测试页面/文件目前是否存在:

$.ajax({
    type: 'HEAD',
    url: 'http://www.example.com/index.php',
    success: function() {
        alert('Page found.');
    },  
    error: function() {
        alert('Page not found.');
    }
});

感谢@kalyfe建议切换到异步方法。

答案 2 :(得分:0)

$.get呢,这只是jQuery Ajax的简写?

// this file exists
$.get('https://upload.wikimedia.org/wikipedia/commons/7/75/Woman_mechanic_working_on_engine_%28cropped%29.jpeg')
  .done(() => {console.log('file exists')})
  .fail(() => {console.log('File does not exist')}
)

// this file does not exist
$.get('https://example.com/inexistent.jpg')
  .done(() => {console.log('file exists')})
  .fail(() => {console.log('File does not exist')}
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

这里的好处是浏览器在浏览器中获取图像,因此您无需在使用两次时将其加载,例如html标签img。这里是一个例子:

$('#myButton').click(()=>{

  let imgUrl = $('#imgUrl').val();
  
  $.get(imgUrl)
  .done(() => {
    $('img').attr('src', imgUrl);
    $('#imgText').text('');
  })
  .fail(() => {
    $('#imgText').text('Image does not exist');
    $('img').attr('src', '');
  })

})
img {
  width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Image url: <input type="text" id="imgUrl" value="https://upload.wikimedia.org/wikipedia/commons/7/75/Woman_mechanic_working_on_engine_%28cropped%29.jpeg"><br>

<button id="myButton" type="button">click here to load image</button>

<div id="imgText"></div>
<img>

答案 3 :(得分:-1)

异步/等待功能

这是一种现代的方法。我一直在寻找针对折旧的同步XHR和AJAX的最佳未来解决方法。

我个人需要安全,因此某些文件对公众不可用。这意味着客户端功能将无法正常工作。我需要一个服务器端脚本来检查这些文件是否存在。

我环顾四周,很难找到所需的功能。还有其他有据可查的用途,但这对我有帮助,可以用作解决OP的问题的另一种方法。

async function fetchAsync (q) {
  // await response of fetch call 
  // Your file now can get the file name to check via server side if it is there.
  let response = await fetch('https://yoursite.com/check_exists.php?'+q+(q==''?'':'&')+'time='+(new Date().getTime()));
  // only proceed once promise is resolved
  let data = await response.json();
  // only proceed once second promise is resolved
  return data;
}
var myFilePath = 'images/dingle.gif';
// trigger async function
// log response or catch error of fetch promise
fetchAsync('filepath='+myFilePath+'')
    .then(data => {
                 //
                 console.log(data.myJsonVar);
           if(data.myJsonVar == 1){ // the php file should check and return {"myJsonVar":1} if it found the file in question or {"myJsonVar":0}
                // Run scripts or functions about here...
                // For me it is to check if the file exists before an upload.
                // This saves the upload from failing after it is uploaded because it is a duplicate.
           }else{
                 // I run my upload script and functions
           }

     }
})
.catch(reason => console.log(reason.message))

我想指出,您可以在PHP文件的json响应中包含任意数量的变量。但是,数量越少越好。