PHP: Como verificar se existe um arquivo de imagem?

97

Preciso ver se existe uma imagem específica no meu cdn.

Tentei o seguinte e não funcionou:

if (file_exists(http://www.example.com/images/$filename)) {
    echo "The file exists";
} else {
    echo "The file does not exist";
}

Mesmo que a imagem exista ou não exista, sempre diz "O arquivo existe". Não sei por que não está funcionando ...

PaperChase
fonte
1
Você deve usar o caminho completo para o arquivo no sistema de arquivos do servidor (por exemplo, '/home/you/public/img/sample.gif').
user9440008
Tenha cuidado com isso, pois você pode descobrir que fazer um deslocamento file_existspara um local remoto será muito lento.
crmpicco

Respostas:

130

Você precisa do nome do arquivo entre aspas pelo menos (como string):

if (file_exists('http://www.mydomain.com/images/'.$filename)) {
  }

Além disso, certifique-se de que $filenameestá devidamente validado. E então, ele só funcionará quando allow_url_fopenestiver ativado em sua configuração de PHP

tricô
fonte
5
Consegui fazer isso com sucesso usando @GetImageSize. No entanto, o que será menos intensivo no servidor?
PaperChase
9
file_exists () precisa usar um caminho de arquivo no disco rígido, não um URL Esta resposta não é útil para mim, não deve ser definida como aceita.
Martin
Do PHP: bool file_exists (string $ filename) A partir do PHP 5.0.0, esta função também pode ser usada com alguns wrappers de URL. Consulte Protocolos e wrappers suportados para determinar quais wrappers suportam a família de funcionalidade stat ().
Adrian P.
se $ filename string for nulo, file_exists retornará true para o diretório. Melhor usar is_file ($
filepath
1
Como as pessoas disseram, ele não funciona em URLs / caminhos remotos. Mas funciona em caminhos locais (caminho do servidor interno onde os arquivos estão localizados). Além disso, de outros métodos, remoto leva até 14 segundos e local, menos de 1 segundo (para um determinado exemplo)
Rafa
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Isso não funcionou para mim. A maneira como fiz isso foi usando getimagesize.

$src = 'http://www.mydomain.com/images/'.$filename;

if (@getimagesize($src)) {

Observe que o '@' significa que se a imagem não existir (nesse caso, a função normalmente geraria um erro getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed:) ela retornará falso.

Jeffrey Jenkinson
fonte
1
if (@getimagesize ($ src)) {faz maravilhas, obrigado, adicionalmente obrigado pela explicação de @ aqui
lesolorzanov

1
getimagesize () funciona, mas certifique-se de incluir o protocolo no URI (por exemplo, @getimagesize('//path/to/image.jpg')não funcionará).
dia

file_exists ou is_file não funcionou para mim, funcionou. obrigado!
Derk Jan Speelman,

@getimagesize diminuirá drasticamente o carregamento da página. Não recomendado. is_file pode ser usado em vez disso e certifique-se de que $ src não seja o url completo: "http: // ..." mas "img / ..."
Bogdan C

is_file e file_exists não funcionam para imagens, mas @getimagesize está funcionando bem.
Alam Zaib de

14

Bem, file_existsnão diz se existe um arquivo, mas sim se existe um caminho . ⚡⚡⚡⚡⚡⚡⚡

Portanto, para verificar se é um arquivo, você deve usar em is_fileconjunto com file_existspara saber se realmente existe um arquivo atrás do caminho, caso contrário file_existsretornará truepara qualquer caminho existente.

Aqui está a função que uso:

function fileExists($filePath)
{
      return is_file($filePath) && file_exists($filePath);
}

2
Como pode haver um caminho existente, mas o arquivo não existe, quando o caminho contém o nome do arquivo?
Andrew

1
quero dizer que funciona até mesmo se o usuário fornecer um caminho e não um arquivo, a função retornaria verdadeiro mesmo que não fosse um arquivo meu amigo.
Rizerzero

Diferenciação interessante e potencialmente importante para fazer. Mas se você verificar os documentos, parece que você só precisa usar is_file para este propósito, e não em conjunto com file_exists.
Andrew

ok, deixe-me resumir isso para você, (use: PaperChase) deseja verificar se um arquivo existe, o problema é que mesmo se ele fornecer um caminho para a função, ele obterá uma resposta verdadeira, para verificar claramente se existe um arquivo então ele usaria Minha função, porque a função php retornaria verdadeiro mesmo se um caminho fosse passado, então o nome da função é ruim, deveria ser Path_exists () e Minha função realmente verifica se existe um arquivo, porque retornaria falso se qualquer coisa diferente de um caminho de arquivo existente é passado. Espero que esteja claro agora.
Rizerzero

Sim, funcionaria bem, mas de acordo com php.net/manual/en/function.is-file.php is_file () já verifica se o caminho / arquivo existe antes de verificar se é um arquivo, então você não deve precisar .
Andrew,

13

Tente assim:

$file = '/path/to/foo.txt'; // 'images/'.$file (physical path)

if (file_exists($file)) {
    echo "The file $file exists";
} else {
    echo "The file $file does not exist";
}

9

Esta é a maneira mais simples de verificar se existe um arquivo:

if(is_file($filename)){
    return true; //the file exist
}else{
    return false; //the file does not exist
}

8

Uma coisa que você precisa entender primeiro: você não tem arquivos .
Um arquivo é um assunto de um sistema de arquivos , mas você está fazendo sua solicitação usando o protocolo HTTP, que não suporta arquivos, mas URLs.

Portanto, você deve solicitar um arquivo inexistente usando seu navegador e ver o código de resposta. se não for 404, você não conseguirá usar nenhum wrapper para ver se existe um arquivo e terá que solicitar seu cdn usando algum outro protocolo, FTP por exemplo


7
public static function is_file_url_exists($url) {
        if (@file_get_contents($url, 0, NULL, 0, 1)) {
            return 1;
        }

        return 0;           
    }

7

Se o arquivo estiver em seu domínio local, você não precisa inserir o URL completo. Apenas o caminho para o arquivo. Se o arquivo estiver em um diretório diferente, será necessário inserir "."

$file = './images/image.jpg';
if (file_exists($file)) {}

Muitas vezes, o "." é deixado de fora, o que fará com que o arquivo seja mostrado como não existente, quando de fato existe.


3

Existe uma grande diferença entre is_filee file_exists.

is_file retorna verdadeiro para arquivos (regulares):

Retorna TRUE se o nome do arquivo existe e é um arquivo normal, FALSE caso contrário.

file_exists retorna verdadeiro para arquivos e diretórios:

Retorna TRUE se o arquivo ou diretório especificado por filename existe; Caso contrário, FALSE .


Nota: Verifique também esta questão stackoverflow para obter mais informações sobre este tópico.


2

Você deve usar o caminho absoluto para ver se o arquivo existe.

$abs_path = '/var/www/example.com/public_html/images/';
$file_url = 'http://www.example.com/images/' . $filename;

if (file_exists($abs_path . $filename)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Se você está escrevendo para o framework CMS ou PHP, pelo que eu sei, todos eles definiram uma constante para o caminho da raiz do documento.

por exemplo, o WordPress usa ABSPATH, que pode ser usado globalmente para trabalhar com arquivos no servidor usando o seu código, bem como a url do site.

Exemplo de Wordpress:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

if (file_exists($image_path)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Estou dando um passo a mais aqui :). Como esse código não precisaria de muita manutenção e seria bastante sólido, eu o escreveria com a instrução if abreviada:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

echo (file_exists($image_path))?'The file exists. URL:' . $file_url:'The file does not exist';

Explicação da instrução IF abreviada:

$stringVariable = ($trueOrFalseComaprison > 0)?'String if true':'String if false';

2

você pode usar cURL. Você pode fazer com que o cURL forneça apenas os cabeçalhos, e não o corpo, o que pode torná-lo mais rápido. Um domínio inválido sempre pode demorar um pouco porque você estará aguardando o tempo limite da solicitação expirar; você provavelmente poderia alterar a duração do tempo limite usando cURL.

Aqui está um exemplo:

function remoteFileExists($url) {
$curl = curl_init($url);

//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);

//do request
$result = curl_exec($curl);

$ret = false;

//if request did not fail
if ($result !== false) {
    //if request was ok, check response code
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

    if ($statusCode == 200) {
        $ret = true;   
    }
}

curl_close($curl);

return $ret;
}
$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
echo 'file exists';
} else {
   echo 'file does not exist';   
}


1

Se estiver usando curl, você pode tentar o seguinte script:

function checkRemoteFile($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,$url);
 // don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch)!==FALSE)
{
    return true;
}
else
{
    return false;
}

}

URL de referência: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/

Yogi Ghorecha
1
preciso de um tempo limite aqui
Mike Q
pode haver uma imagem 404 genérica
Your Common Sense
2
Sim - então a imagem existe no URL especificado.
Pedro
1

tente isto:

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}
Dev_meno
fonte
1

Se o caminho para sua imagem for relativo à raiz do aplicativo, é melhor usar algo assim:

function imgExists($path) {
    $serverPath = $_SERVER['DOCUMENT_ROOT'] . $path;

    return is_file($serverPath)
        && file_exists($serverPath);
}

Exemplo de uso para esta função:

$path = '/tmp/teacher_photos/1546595125-IMG_14112018_160116_0.png';

$exists = imgExists($path);

if ($exists) {
    var_dump('Image exists. Do something...');
}

Eu acho que é uma boa ideia criar algo como uma biblioteca para verificar a existência de imagens aplicáveis ​​a diferentes situações. Acima, muitas respostas excelentes que você pode usar para resolver essa tarefa.

B. Bohdan
fonte
0

Leia os primeiros 5 bytes do HTTP usando fopen()e, em fread()seguida, use:

DEFINE("GIF_START","GIF");
DEFINE("PNG_START",pack("C",0x89)."PNG");
DEFINE("JPG_START",pack("CCCCCC",0xFF,0xD8,0xFF,0xE0,0x00,0x10)); 

para detectar a imagem.

Peter
fonte
pode haver uma imagem 404 genérica
Your Common Sense
2
Sim - então a imagem existe no URL especificado.
Pedro
0

file_existslê não apenas arquivos, mas também caminhos. então, quando $filenameestiver vazio, o comando será executado como se estivesse escrito assim:

file_exists("http://www.example.com/images/")

se o diretório / imagens / existir, a função ainda retornará true.

Eu normalmente escrevo assim:

// !empty($filename) is to prevent an error when the variable is not defined
if (!empty($filename) && file_exists("http://www.example.com/images/$filename"))
{
    // do something
}
else
{
    // do other things
}
dapidmini
fonte
0

file_exists($filepath) retornará um resultado verdadeiro para um diretório e caminho de arquivo completo, portanto, nem sempre é uma solução quando um nome de arquivo não é passado.

is_file($filepath) só retornará verdadeiro para caminhos de arquivo completos

PodTech.io
fonte
0

você precisa do caminho do servidor com file_exists

por exemplo

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
Altravista
fonte
0
if(@getimagesize($image_path)){
 ...}

Está trabalhando para mim.

Safeer Ahmed
fonte