Como verifico se o arquivo existe no jQuery ou no JavaScript puro?

259

Como verifico se existe um arquivo no meu servidor em jQuery ou JavaScript puro?

usertest
fonte

Respostas:

433

Com o jQuery:

$.ajax({
    url:'http://www.example.com/somefile.ext',
    type:'HEAD',
    error: function()
    {
        //file not exists
    },
    success: function()
    {
        //file exists
    }
});

EDITAR:

Aqui está o código para verificar o status 404, sem usar o jQuery

function UrlExists(url)
{
    var http = new XMLHttpRequest();
    http.open('HEAD', url, false);
    http.send();
    return http.status!=404;
}

Pequenas alterações e, em vez disso, poderia verificar o status do código de status HTTP 200 (êxito).

EDIÇÃO 2: Como a sincronização XMLHttpRequest foi preterida, você pode adicionar um método utilitário como este para fazê-lo de forma assíncrona:

function executeIfFileExist(src, callback) {
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if (this.readyState === this.DONE) {
            callback()
        }
    }
    xhr.open('HEAD', src)
}
cichy
fonte
5
no seu exemplo de javascript puro, você deve OnReadyStateChangeassociar um evento antes de verificar o HTTP_STATUS.
RobertPitt
8
O código de exemplo está errado e não há nada sobre o que está acontecendo no servidor. A pergunta original é bastante vaga, mas não há razão para supor que o servidor que está executando lá esteja de fato mapeando URLs diretamente para o sistema de arquivos. Honestamente, não vejo por que essa resposta é tão popular, pois não diz exatamente como fazer o que a pergunta pediu.
Pointy
75
@Pointy Poderia ser porque ele resolve algo que o resto de nós está pesquisando para
Ian Hunter
4
@ cichy - isso carrega o arquivo na memória ou não? Estou procurando verificar a existência, mas não carregar um arquivo.
27713 Brian
11
O XMLHttpRequest síncrono no encadeamento principal foi descontinuado por causa de seus efeitos prejudiciais à experiência do usuário final. Para obter mais ajuda xhr.spec.whatwg.org (Este aviso pelo navegador)
kupendra
71

Uma abordagem semelhante e mais atualizada.

$.get(url)
    .done(function() { 
        // exists code 
    }).fail(function() { 
        // not exists code
    })
Matthew James Davis
fonte
2
por que isso é mais atualizado? $.ajaxparece melhor se for mais compatível com versões anteriores, certo?
tim Peterson
15
O $ .ajax também funciona, mas as funções de sucesso / erro / conclusão são preteridas em favor de promessas, métodos de fazer / falhar / sempre. leia mais sobre isso aqui api.jquery.com/jQuery.ajax . Eu costumava chegar aqui porque estamos interessados ​​apenas em um get simples, mas isso é apenas uma abreviação de $ .ajax ({url: url, digite: 'GET'}).
Matthew James Davis
4
Se a imagem não existir, o eco do console será um erro 404. Existe uma maneira de remover isso, porque meu aplicativo está sempre esperando uma imagem para não existe ...
user1534664
1
Não é possível, consulte: stackoverflow.com/a/16379746/1981050 . No entanto, isso não deve interromper seu comportamento. Isso produzirá apenas um log externo.
Matthew James Davis
1
questões de origem cruzada não estão relacionados a este
Matthew James Davis
69

Isso funciona para mim:

function ImageExist(url) 
{
   var img = new Image();
   img.src = url;
   return img.height != 0;
}
Testador
fonte
2
Embora algumas outras respostas sejam melhores para sua função, eu marquei essa resposta com +1, pois é o que eu estava procurando. Lembre-se de que você sempre terá zero, a menos que carregue o conteúdo primeiro !. ie: window.addEventListener ('load', function () {
SpiRail
Na verdade, eu ainda tinha problemas, mesmo com o carregamento da janela. Parece que a imagem não pode ser medida até que seja armazenada em cache de alguma forma. De qualquer forma, não trabalho para mim no carregamento da primeira vez da página. (ou seja: o usuário nunca viu essa imagem antes). Pode funcionar para você, se você tem a imagem em uma página anterior, talvez ...
SpiRail
3
Isso porque define a fonte da imagem e verifica IMEDIATAMENTE a altura da imagem que ainda não terminou o download. Você precisaria adicionar um manipulador de onload para que isso funcionasse. Esta não é uma abordagem confiável por esse motivo exato.
Dudewad
Por que não é confiável se você adicionar um img.onload hanlder como um stackoverflow.com/a/12355031/988591 ?
jj_
3
A pergunta é sobre um arquivo , não uma imagem! Se o URL existir e não for um arquivo, sua altura será 0!
Apostolos
44

eu usei esse script para adicionar uma imagem alternativa

function imgError()
{
alert('The image could not be loaded.');
}

HTML:

<img src="image.gif" onerror="imgError()" />

http://wap.w3schools.com/jsref/event_onerror.asp

Gino
fonte
24
Ótimo - não sabia disso. Você pode fazer o seguinte para definir uma alternativa de salvamento se uma imagem não existir: <img src = "image.gif" onerror = "this.src = 'alternative.gif'">
Ridcully
2
@Ridcully Ah, mas e se a alternativa falhar? Então você está em um loop sem fim, certo?
rvighne
Se a alternativa falhar, eu suponho que há algo mais errado no lado do servidor (ou do lado do programador: P)
Erenor Paz
Você sempre pode definir o OnError da tag img para nada ao definir a imagem alt para impedir o loop infinito.
precisa saber é o seguinte
Bom trabalho, senhor. Funciona como um encanto.
Hiren
24

Enquanto você estiver testando arquivos no mesmo domínio, isso funcionará:

function fileExists(url) {
    if(url){
        var req = new XMLHttpRequest();
        req.open('GET', url, false);
        req.send();
        return req.status==200;
    } else {
        return false;
    }
}

Observe que este exemplo está usando uma solicitação GET, que além de obter os cabeçalhos (tudo o que você precisa para verificar se o arquivo existe) obtém o arquivo inteiro. Se o arquivo for grande o suficiente, esse método poderá demorar um pouco para ser concluído.

A melhor maneira de fazer isso seria mudar esta linha: req.open('GET', url, false);parareq.open('HEAD', url, false);

Moob
fonte
5
Desculpe, mas é efetivamente o mesmo que a resposta aceita. Me ignore.
Moob
1
seus mais alguns detalhes sobre a forma não-jQuery que pode ser útil
tim Peterson
@Moob, não é "efetivamente o mesmo que a resposta aceita", você está enviando uma solicitação GET, que é muito diferente da solicitação HEAD.
YemSalat 11/02
async: false, a operação síncrona no Firefox versão 30.0 e posterior e nas versões recentes / atuais do Chrome foi preterida devido à experiência desfavorável do usuário. A tentativa de uso resulta em falha / erro. Deve usar async: truecom a função de retorno de chamada para operação assíncrona.
Kevin Fegan
Por favor, aguarde a resposta antes de continuar a executar mais JS? Obrigado.
precisa saber é o seguinte
16

Eu estava tendo um problema de permissões entre domínios ao tentar executar a resposta a esta pergunta, então fui com:

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

Parece funcionar muito bem, espero que isso ajude alguém!

Shaun
fonte
3
Eu acho que isso perderá os valores booleanos porque eles são retornados dos retornos de chamada, não da função UrlExists.
mikebridge
isso não pode funcionar, você deve ler o seguinte: stackoverflow.com/questions/14220321/…
Hacketo
como fica o URL? , com extensão ou sem extensão?
151291
10

Veja como fazê-lo da maneira ES7, se você estiver usando o transpiler Babel ou o 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;
  }
}

Em seu outro asyncescopo, você pode verificar facilmente se existe um URL:

const isValidUrl = await isUrlFound('http://www.example.com/somefile.ext');

console.log(isValidUrl); // true || false
Nik Sumeiko
fonte
5

Eu uso esse script para verificar se existe um arquivo (ele também lida com o problema de origem cruzada):

$.ajax(url, {
       method: 'GET',
       dataType: 'jsonp'
         })
   .done(function(response) { 
        // exists code 
    }).fail(function(response) { 
        // doesnt exist
    })

Observe que o seguinte erro de sintaxe é gerado quando o arquivo que está sendo verificado não contém JSON.

SyntaxError não capturado: token inesperado <

Gëzim Musliaj
fonte
3

Uma chamada assíncrona para verificar se existe um arquivo é a melhor abordagem, pois não prejudica a experiência do usuário, aguardando uma resposta do servidor. Se você fizer uma chamada .opencom o terceiro parâmetro definido como false (como em muitos exemplos acima, por exemplo http.open('HEAD', url, false);), esta será uma chamada síncrona e você receberá um aviso no console do navegador.

Uma abordagem melhor é:

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

fonte: https://xhr.spec.whatwg.org/

Jim Bergman
fonte
Também recebo uma resposta de aviso no log do console com seu método, alguma ideia?
Pierre
Tente chamar .opencom o terceiro conjunto de parâmetros para truese certificar de que o chama de forma assíncrona, assim client.open("HEAD", address, true);@Pierre
Jim Bergman
2

Para um computador cliente, isso pode ser alcançado por:

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")
}

Este é o meu programa para transferir um arquivo para um local específico e mostra um alerta se ele não existir

yasir amin 9th-b DR.VSMPS
fonte
1
Se você for usar o FileSystemObject, parece mais fácil usar o método FileExists (). msdn.microsoft.com/pt-br/library/aa265024(v=vs.60).aspx
Mark F Guerra
2

Função JavaScript para verificar se existe um arquivo:

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;
    }
}
Ani Menon
fonte
1

Primeiro cria a função

$.UrlExists = function(url) {
	var http = new XMLHttpRequest();
    http.open('HEAD', url, false);
    http.send();
    return http.status!=404;
}

Depois de usar a função da seguinte maneira

if($.UrlExists("urlimg")){
	foto = "img1.jpg";
}else{
	foto = "img2.jpg";
}

$('<img>').attr('src',foto);

Vladimir Salguero
fonte
Eu tentei aqui, mas não consegui fazê-lo funcionar. O que eu tenho sentido falta?
Chetabahana 24/03
1

Esta é uma adaptação à resposta aceita, mas não consegui o que precisava da resposta e tive que testar se funcionava como um palpite, por isso estou colocando minha solução aqui.

Precisávamos verificar se um arquivo local existia e permitir apenas que o arquivo (um PDF) fosse aberto se ele existisse. Se você omitir o URL do site, o navegador determinará automaticamente o nome do host - fazendo com que ele funcione no host local e no servidor:

$.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");

    }
});
Josh Harris
fonte
0

O que você precisa fazer é enviar uma solicitação ao servidor para que ele faça a verificação e, em seguida, enviar o resultado para você.

Com que tipo de servidor você está tentando se comunicar? Pode ser necessário escrever um pequeno serviço para responder à solicitação.

MadcapLaugher
fonte
0

Isso não aborda a questão do OP, mas para quem está retornando resultados de um banco de dados: aqui está um método simples que eu usei.

Se o usuário não fizesse o upload de um avatar, o avatarcampo seria NULLassim, então eu inserirei uma imagem de avatar padrão no imgdiretório

function getAvatar(avatar) {
    if(avatar == null) {
        return '/img/avatar.jpg';
    } else {
        return '/avi/' + avatar;
    }
}

então

<img src="' + getAvatar(data.user.avatar) + '" alt="">
timgavin
fonte
0

Funciona para mim, use o iframe para ignorar os navegadores. Mostrar mensagem de erro GET

 var imgFrame = $('<iframe><img src="' + path + '" /></iframe>');
 if ($(imgFrame).find('img').attr('width') > 0) {
     // do something
 } else {
     // do something
 }
AnhMV
fonte
0

Queria uma função que retornasse um valor booleano, encontrei problemas relacionados ao fechamento e assincronicidade. Eu resolvi desta maneira:

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);
},
Gianlorenzo Lenza
fonte