ファイルがjQueryまたは純粋なJavaScriptに存在するかどうかを確認するにはどうすればよいですか?


回答:


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:sync 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をファイルシステムに直接マッピングしていると想定する理由はありません。正直なところ、この質問が求めていることを行う方法を実際に述べていないため、この回答がなぜそれほど人気が​​あるのか​​わかりません。
ポインティ

75
@Pointyは、他の人がグーグルで解決している問題を解決しているためかもしれません
Ian Hunter

4
@cichy-これはファイルをメモリにロードしますか?存在を確認したいのですが、ファイルをロードしていません。
ブライアン

11
メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。さらにヘルプが必要な場合はxhr.spec.whatwg.org(ブラウザによるこの警告)
kupendra

71

同様の、より最新のアプローチ。

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

2
なぜこれがより最新なのですか?$.ajax下位互換性が高いほうがいいようですよね?
ティム・ピーターソン、2013

15
$ .ajaxも機能しますが、promise、done / fail / alwaysメソッドを支持して、success / error / complete関数は非推奨になりました。詳細については、api.jquery.com / jQuery.ajaxをご覧ください。単純なgetにのみ関心があるため、ここでgetを使用しましたが、これは$ .ajax({url:url、type: 'GET'})の省略形にすぎません。
マシュージェームスデイビス

4
画像が存在しない場合、コンソールは404エラーをエコーし​​ます。これを削除する方法はありますか?私のアプリケーションは常に1つのイメージが存在しないことを期待しているので...
user1534664

1
不可能です。stackoverflow.com / a / 16379746/1981050を参照してください。ただし、これによって動作が中断されることはありません。無関係なログが生成されるだけです。
マシュージェームスデイビス

1
クロスオリジンの問題はこれとは無関係です
マシュージェームスデイビス

69

これは私にとってはうまくいきます:

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

2
他のいくつかの回答は機能的に優れていますが、私が探していたものであるため、この回答を+1しました。最初にコンテンツをロードしない限り、常にゼロになります。ie:window.addEventListener( 'load'、function(){
SpiRail

実は、ウィンドウがロードされても、まだ問題がありました。どういうわけかキャッシュされるまで画像を測定できないようです。とにかく、私はページの最初のロードでは私のために働きません。(つまり、ユーザーはこれまでにこの画像を見たことがない)。前のページの画像があると
うまくいく

3
これは、画像のソースを設定し、すぐにダウンロードが完了していない画像の高さを確認するためです。これを機能させるには、onloadハンドラーを追加する必要があります。これはまさにその理由から信頼できるアプローチではありません。
dudewad 2013

このようにimg.onloadハンダーを追加した場合、なぜ信頼できないのですか?stackoverflow.com/a/12355031/988591
jj_ 2014年

3
質問は、画像ではなくファイルについてです!URLが存在し、ファイルでない場合、高さは0になります。
Apostolos 2017

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

altイメージを設定するときは、いつでもimgタグのOnErrorを何も設定せずに無限ループを防ぐことができます。
KingOfHypocrites 2014

すばらしい仕事です。魅力のように機能します。
hiren 2018

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

1
参考になるjQuery以外のフォームの詳細
ティムピーターソン、2013

@Moob、「事実上、受け入れられた回答と同じ」ではないため、GETリクエストを送信しています。これは、HEADリクエストとはかなり異なります。
YemSalat 2014

async: false、Firefoxバージョン30.0以降、およびChromeの最近/現在のバージョンでの同期操作は、ユーザーエクスペリエンスが低下するため非推奨です。使用しようとすると、失敗/エラーになります。async: true非同期操作のコールバック関数で使用する必要があります。
ケビン

JSの実行を続ける前に、この応答を待ってください。ありがとうございました。
vladanPro 2018年

16

この質問への回答を実行しようとすると、クロスドメインのアクセス許可の問題が発生したため、次のようにしました。

function UrlExists(url) {
$('<img src="'+ url +'">').load(function() {
    return true;
}).bind('error', function() {
    return false;
});
}

それは素晴らしいようです、これが誰かを助けることを願っています!


3
UrlExists関数ではなくコールバックから返されるため、これはブール値を失うと思います。
マイクブリッジ2014年

これは、動作しないことができるあなたはこの読みください:stackoverflow.com/questions/14220321/...を
Hacketo

URLはどのように見えますか?、拡張子付きまたは拡張子なし?
151291

10

ES7の方法で行う方法は次のとおりです。BabelトランスパイラーまたはTypescript 2を使用している場合:

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/


また、あなたの方法でコンソールログに警告応答が表示されます、何か考えはありますか?
Pierre

呼び出し試し.openに三番目のパラメータを設定してtrue確認してください、それはこのように、非同期的にそれを呼び出すようにするclient.open("HEAD", address, true);@Pierre
ジム・バーグマン

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/en-us/library/aa265024(v=vs.60).aspx
Mark F Guerra 14年

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


ここで試しましたが、うまくいきませんでした。何が欠けているのですか?
チェタバハナ2015年

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);
},
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.