PHP: ¿Cómo comprobar si existe un archivo de imagen?

97

Necesito ver si existe una imagen específica en mi cdn.

He intentado lo siguiente y no funciona:

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

Incluso si la imagen existe o no, siempre dice "El archivo existe". No estoy seguro de por qué no funciona ...

Persecución de papel
fuente
1
Debe usar la ruta completa al archivo en el sistema de archivos de su servidor (por ejemplo, '/home/you/public/img/sample.gif').
user9440008
Tenga cuidado con esto, ya que puede encontrar que realizar un viaje file_existsa una ubicación remota será muy lento.
crmpicco

Respuestas:

130

Necesita el nombre del archivo entre comillas al menos (como cadena):

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

Además, asegúrese de que $filenameesté debidamente validado. Y luego, solo funcionará cuando allow_url_fopenesté activado en su configuración de PHP

Knittl
fuente
5
Pude hacerlo con éxito usando @GetImageSize. Sin embargo, ¿qué requerirá menos servidor?
PaperChase
9
file_exists () necesita usar una ruta de archivo en el disco duro, no una URL. Esta no es una respuesta útil para mí, no debería configurarse como aceptada.
Martin
Desde PHP: bool file_exists (string $ filename) A partir de PHP 5.0.0, esta función también se puede utilizar con algunos contenedores de URL. Consulte Protocolos y envoltorios admitidos para determinar qué envoltorios admiten la familia de funciones stat ().
Adrian P.
si $ filename string es nulo, file_exists devolverá verdadero para el directorio. Es mejor usar is_file ($ filepath)
PodTech.io
1
Como dijo la gente, no funciona en URL / rutas remotas. Pero funciona en rutas locales (ruta interna del servidor donde se encuentran los archivos). Además, a partir de otros métodos, el control remoto tarda hasta 14 segundos y el local, menos de 1 segundo (para un ejemplo
concreto
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Esto no funcionó para mí. La forma en que lo hice fue usando getimagesize.

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

if (@getimagesize($src)) {

Tenga en cuenta que '@' significará que si la imagen no existe (en cuyo caso la función normalmente arrojaría un error getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed:) devolverá falso.

Jeffrey Jenkinson
fuente
1
if (@getimagesize ($ src)) {funciona de maravilla, gracias, además gracias por la explicación de @ here
lesolorzanov

1
getimagesize () funciona, pero asegúrese de incluir el protocolo en el URI (por ejemplo, @getimagesize('//path/to/image.jpg')no funcionará).
jueves

file_exists o is_file no funcionó para mí, esto sí. ¡gracias!
Derk Jan Speelman

@getimagesize ralentizará drásticamente la carga de la página. No recomendado. is_file se puede usar en su lugar y asegúrese de que $ src no sea la URL completa: "http: // ..." pero "img / ..."
Bogdan C

is_file y file_exists no funcionan para imágenes, pero @getimagesize funciona bien.
Alam Zaib

14

Bueno, file_existsno dice si existe un archivo, dice si existe una ruta . ⚡⚡⚡⚡⚡⚡⚡

Por lo tanto, para verificar si es un archivo, debe usarlo is_filejunto con file_existspara saber si realmente hay un archivo detrás de la ruta; de lo contrario file_exists, volverá truepara cualquier ruta existente.

Aquí está la función que uso:

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

2
¿Cómo puede haber una ruta existente, pero el archivo no existe, cuando la ruta contiene el nombre del archivo?
Andrew

1
Quiero decir que incluso funciona si el usuario da una ruta y no un archivo, la función volvería verdadera incluso si no es un archivo, amigo mío.
Rizerzero

Diferenciación interesante y potencialmente importante para hacer. Pero si revisa los documentos, parece que solo necesita usar is_file para este propósito, y no junto con file_exists.
Andrew

ok déjeme resumirle esto, (use: PaperChase) quiere verificar si existe un archivo, su problema es que incluso si le da una ruta a la función, obtendrá una respuesta verdadera, así que para verificar claramente si existe un archivo, entonces usaría Mi función, porque la función php devolvería verdadero incluso si se pasa una ruta, por lo que el nombre de la función es incorrecto, debería ser Path_exists () y Mi función realmente verifica si existe un archivo, porque devolvería falso si se pasa cualquier otra cosa que una ruta de archivo existente. Espero que esto esté claro ahora.
Rizerzero

Sí, funcionaría bien, pero de acuerdo con php.net/manual/en/function.is-file.php is_file () ya verifica si la ruta / archivo existe antes de verificar si es un archivo, por lo que no debería necesitar .
Andrew

13

Intente así:

$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 es la forma más sencilla de comprobar si existe un archivo:

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

8

Una cosa que tienes que entender primero: no tienes archivos .
Un archivo es un tema de un sistema de archivos , pero está realizando su solicitud utilizando el protocolo HTTP que no admite archivos, excepto URL.

Por lo tanto, debe solicitar un archivo inexistente usando su navegador y ver el código de respuesta. si no es 404, no puede usar ningún contenedor para ver si existe un archivo y debe solicitar su cdn usando algún otro protocolo, FTP por ejemplo


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

        return 0;           
    }

7

Si el archivo está en su dominio local, no es necesario que ingrese la URL completa. Solo la ruta al archivo. Si el archivo está en un directorio diferente, entonces debe anteponer la ruta con "."

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

A menudo, el "." se deja fuera, lo que hará que el archivo se muestre como no existente, cuando de hecho lo hace.


3

Existe una gran diferencia entre is_filey file_exists.

is_file devuelve verdadero para archivos (normales):

Devuelve VERDADERO si el nombre del archivo existe y es un archivo normal, FALSO en caso contrario.

file_exists devuelve verdadero tanto para archivos como para directorios:

Devuelve VERDADERO si el archivo o directorio especificado por nombre de archivo existe; FALSO de lo contrario.


Nota: Consulte también esta pregunta de stackoverflow para obtener más información sobre este tema.


2

Tienes que usar la ruta absoluta para ver si el archivo 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";

}

Si está escribiendo para el marco CMS o PHP, hasta donde yo sé, todos ellos han definido una constante para la ruta raíz del documento.

por ejemplo, WordPress usa ABSPATH que se puede usar globalmente para trabajar con archivos en el servidor usando su código así como la URL del sitio.

Ejemplo 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";

}

Estoy haciendo un esfuerzo adicional aquí :). Debido a que este código no necesitaría mucho mantenimiento y es bastante sólido, lo escribiría con una declaración abreviada if:

$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';

Declaración abreviada IF explicada:

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

2

puedes usar cURL. Puede hacer que cURL solo le proporcione los encabezados, y no el cuerpo, lo que podría hacerlo más rápido. Un dominio incorrecto siempre puede tardar un tiempo porque estará esperando que se agote el tiempo de espera de la solicitud; probablemente podría cambiar la duración del tiempo de espera usando cURL.

He aquí un ejemplo:

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

Si está utilizando curl, puede probar el siguiente 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 referencia: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/

Yogi Ghorecha
1
necesito un tiempo de espera aquí
Mike Q
podría haber una imagen 404 genérica
Your Common Sense
2
Sí, entonces la imagen existe en la URL especificada.
Peter
1

prueba esto :

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

Si la ruta a su imagen es relativa a la raíz de la aplicación, es mejor usar algo como esto:

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

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

Ejemplo de uso de esta función:

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

$exists = imgExists($path);

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

Creo que es una buena idea crear algo como una biblioteca para verificar la existencia de la imagen aplicable a diferentes situaciones. Hay muchas respuestas excelentes que puede utilizar para resolver esta tarea.

B. Bohdan
fuente
0

Lea los primeros 5 bytes de HTTP usando fopen()y fread()luego use esto:

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

para detectar imagen.

Pedro
fuente
podría haber una imagen 404 genérica
Your Common Sense
2
Sí, entonces la imagen existe en la URL especificada.
Peter
0

file_existslee no solo archivos, sino también rutas. así que cuando $filenameestá vacío, el comando se ejecutará como si estuviera escrito así:

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

si el directorio / imágenes / existe, la función seguirá regresando true.

Normalmente lo escribo así:

// !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
fuente
0

file_exists($filepath) devolverá un resultado verdadero para un directorio y una ruta de archivo completa, por lo que no siempre es una solución cuando no se pasa un nombre de archivo.

is_file($filepath) solo devolverá verdadero para rutas de archivo completas

PodTech.io
fuente
0

necesitas la ruta del servidor con file_exists

por ejemplo

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

Funciona para mi.

Safeer Ahmed
fuente