如何在jQuery或纯JavaScript中检查服务器上的文件是否存在?
使用异步调用来检查文件是否存在是更好的方法,因为它不会等待来自服务器的响应而降低用户体验。如果您调用.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 );
}
}
source: https://xhr.spec.whatwg.org/
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")
}
ActiveXObject
只在 Internet Explorer 中可用,因此在其他浏览器中无法使用。 - Anderson Green这是对已接受答案的调整,但我没有从答案中获得所需内容,不得不测试这个想法是否有效,因此我在这里提供我的解决方案。
我们需要验证本地文件是否存在,并且只允许打开该文件(PDF),如果它存在。如果省略网站的URL,浏览器将自动确定主机名 - 这可以使它在本地主机和服务器上工作:
$.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");
}
});
首先创建函数
$.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);
function testFileExists(src, successFunc, failFunc) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (this.readyState === this.DONE) {
if (xhr.status === 200) {
successFunc(xhr);
} else {
failFunc(xhr);
}
}
}
// xhr.error = function() {
// failFunc(xhr);
// }
// xhr.onabort = function() {
// failFunc(xhr);
// }
// xhr.timeout = function() {
// failFunc(xhr);
// }
xhr.timeout = 5000; // TIMEOUT SET TO PREFERENCE (5 SEC)
xhr.open('HEAD', src, true);
xhr.send(null); // VERY IMPORTANT
}
function fileExists(xhr) {
alert("File exists !! Yay !!");
}
function fileNotFound(xhr) {
alert("Cannot find the file, bummer");
}
testFileExists("test.html", fileExists, fileNotFound);
我无法通过任何中止、错误或超时回调强制它返回。 在上面的测试中,每个回调都返回了一个主状态码0,因此我将它们删除了。你可以尝试一下。 我将超时设置为5秒,因为默认值似乎非常过度。 使用异步调用,如果没有send()命令,它似乎不会执行任何操作。
对我来说有效,使用iframe忽略浏览器显示GET错误信息
var imgFrame = $('<iframe><img src="' + path + '" /></iframe>');
if ($(imgFrame).find('img').attr('width') > 0) {
// do something
} else {
// do something
}
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);
},
这并没有回答楼主的问题,但对于那些从数据库返回结果的人来说,这是我使用的一种简单方法。
如果用户没有上传头像,则 avatar
字段将是 NULL
,因此我会从 img
目录中插入默认头像图像。
function getAvatar(avatar) {
if(avatar == null) {
return '/img/avatar.jpg';
} else {
return '/avi/' + avatar;
}
}
那么
<img src="' + getAvatar(data.user.avatar) + '" alt="">
true
调用.open
,以确保它异步调用,像这样client.open("HEAD", address, true);
@Pierre - Jim Bergman