PHP: Resim dosyası olup olmadığı nasıl kontrol edilir?


99

CDn'mde belirli bir görüntünün olup olmadığını görmem gerekiyor.

Aşağıdakileri denedim ve çalışmıyor:

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

Görüntü mevcut olsa veya olmasa bile, her zaman "Dosya var" diyor. Neden çalışmadığından emin değilim ...


1
Sunucu dosya sisteminizde dosyalamak için tam yolu kullanmalısınız (örneğin, '/home/you/public/img/sample.gif').
user9440008

Bu konuda dikkatli olun, çünkü file_existsuzak bir konuma a yapmak çok yavaş olacaktır.
crmpicco

Yanıtlar:


130

Dosya adına en azından (dize olarak) tırnak içinde ihtiyacınız var:

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

Ayrıca, $filenameuygun şekilde doğrulandığından emin olun . Ve sonra, yalnızca allow_url_fopenPHP yapılandırmanızda etkinleştirildiğinde çalışır.


5
@ GetImageSize kullanarak bunu başarıyla yapabildim. Bununla birlikte, sunucu yoğunluğu ne kadar az olacak?
PaperChase

9
file_exists () 'in sabit sürücüde bir dosya yolu kullanması gerekiyor, bir URL değil Bu benim için kullanışlı bir cevap değil, kabul edildiği gibi ayarlanmamalıdır.
Martin

PHP'den: bool file_exists (string $ filename) PHP 5.0.0'dan itibaren, bu işlev bazı URL sarmalayıcılarla da kullanılabilir. Hangi sarmalayıcıların stat () işlevsellik ailesini desteklediğini belirlemek için Desteklenen Protokoller ve Sarmalayıcılar'a bakın.
Adrian P.

$ filename string değeri null ise, file_exists dizin için true değerini döndürür. Kullanım is_file Better ($ filepath)
PodTech.io

1
İnsanların dediği gibi, uzak URL / yollarda çalışmıyor. Ancak yerel yollarda çalışır (dosyaların bulunduğu dahili sunucu yolu). Ayrıca, diğer yöntemlerden uzak, 14 saniye kadar uzun sürüyor ve yerel, 1 saniyeden kısa sürüyor (belirli bir örnek için)
Rafa

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

Bu benim için işe yaramadı. Bunu yaptığım yol getimagesize kullanmaktı.

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

if (@getimagesize($src)) {

'@' İşaretinin, görüntü yoksa (bu durumda işlev genellikle bir hata atar :) anlamına getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failedgeleceğini unutmayın.


1
if (@getimagesize ($ src)) {harikalar yaratıyor, teşekkür ederim, ayrıca @ burada açıklaması için teşekkür ederim
lesolorzanov

1
getimagesize () çalışır, ancak URI'ye protokolü dahil ettiğinizden emin olun (örneğin @getimagesize('//path/to/image.jpg')çalışmaz).
thdoan

file_exists veya is_file benim için işe yaramadı, bu yaptı. teşekkür ederim!
Derk Jan Speelman

@getimagesize, sayfanın yüklenmesini önemli ölçüde yavaşlatır. Tavsiye edilmez. bunun yerine is_file kullanılabilir ve $ src'nin tam url olmadığından emin olun: "http: // ..." ama "img / ..."
Bogdan C

is_file ve file_exists resimler için çalışmıyor ama @getimagesize iyi çalışıyor.
Alam Zaib

14

Eh, file_existsbir dosya varsa bir eğer diyor, söylemez yolu var . ⚡⚡⚡⚡⚡⚡

Bu nedenle, bir dosya olup olmadığını kontrol etmek için, yolun arkasında gerçekten bir dosya olup olmadığını bilmek için is_filebirlikte kullanmalısınız file_exists, aksi takdirde mevcut herhangi bir yol için file_existsgeri dönecektir true.

İşte kullandığım işlev:

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

2
Yol dosya adını içerdiğinde, bir yol nasıl olabilir, ancak dosya yok olabilir?
Andrew

1
Demek istediğim, kullanıcı bir dosya değil de bir yol verse bile işe yarıyor, fonksiyon bir dosya olmasa bile doğru geri dönecekti arkadaşım.
Rizerzero

İlginç ve potansiyel olarak önemli bir ayrım yapmak. Ancak dokümanları kontrol ederseniz, bu amaç için sadece is_file kullanmanız gerektiği ve file_exists ile bağlantılı olmadığı görülüyor.
Andrew

Tamam, bunu size özetleyeyim, (kullanın: PaperChase) bir dosya_ var olup olmadığını kontrol etmek istiyor, sorunu, işleve giden yolu verse bile gerçek bir yanıt alacağı, böylece bir dosyanın var olup olmadığını açıkça kontrol etmesidir. My fonksiyonunu kullanırdı, çünkü php fonksiyonu bir yol geçse bile true dönecektir, bu yüzden fonksiyon adı kötü, Path_exists () olmalı ve My function Gerçekten bir dosyanın var olup olmadığını kontrol ediyor, çünkü eğer false döndürürse var olan bir dosya yolundan başka bir şey aktarılır. Umarım bu artık açıktır.
Rizerzero

Evet, iyi çalışır, ancak php.net/manual/en/function.is-file.php'ye göre is_file (), bir dosya olup olmadığını kontrol etmeden önce yolun / dosyanın var olup olmadığını kontrol eder, bu nedenle yapmanız gerekmez .
Andrew

13

Şöyle dene:

$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

Bir dosyanın var olup olmadığını kontrol etmenin en basit yolu:

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

8

Önce anlamanız gereken bir şey var: dosyanız yok .
Bir dosya bir dosya sisteminin konusudur , ancak isteğinizi URL hariç hiçbir dosyayı destekleyen HTTP protokolünü kullanarak yapıyorsunuz.

Bu nedenle, tarayıcınızı kullanarak mevcut olmayan bir dosyayı talep etmeli ve yanıt kodunu görmelisiniz. 404 değilse, bir dosya olup olmadığını görmek için herhangi bir sarmalayıcı kullanamazsınız ve cdn'nizi başka bir protokol, örneğin FTP kullanarak istemeniz gerekir.


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

        return 0;           
    }

7

Dosya yerel etki alanınızdaysa, tam URL'yi girmenize gerek yoktur. Yalnızca dosyanın yolu. Dosya farklı bir dizindeyse, yolun başına "." Koymanız gerekir.

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

Çoğu zaman "." kapalı bırakılır, bu da dosyanın gerçekte var olmadığı halde mevcut değil olarak gösterilmesine neden olur.


3

is_fileVe arasında büyük bir fark var file_exists.

is_file (normal) dosyalar için doğru döndürür:

İade DOĞRU dosya adı, varsa ve bir normal dosya ise FALSE aksi.

file_exists hem dosyalar hem de dizinler için true değerini döndürür:

Dosya adı ile belirtilen dosya veya dizin varsa DOĞRU döndürür ; Aksi takdirde FALSE .


Not: Ayrıca kontrol Bu stackoverflow soru bu konu hakkında daha fazla bilgi için.


2

Dosyanın var olup olmadığını görmek için mutlak yolu kullanmanız gerekir.

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

}

CMS veya PHP çerçevesi için yazıyorsanız, bildiğim kadarıyla hepsi belge kök yolu için sabit tanımlamıştır.

Örneğin, WordPress, hem kodunuzu hem de site URL'sini kullanarak sunucudaki dosyalarla çalışmak için küresel olarak kullanılabilen ABSPATH kullanır.

Wordpress örneği:

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

}

Burada fazladan bir mil gidiyorum :). Bu kod çok fazla bakım gerektirmediğinden ve oldukça sağlam olduğundan, if ifadesiyle kısaca yazardım:

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

Shorthand IF ifadesi şöyle açıklandı:

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

2

cURL kullanabilirsiniz. Vücudu değil, yalnızca başlıkları vermek için cURL alabilirsiniz, bu da onu daha hızlı hale getirebilir. Hatalı bir alan adı her zaman biraz zaman alabilir çünkü isteğin zaman aşımına uğramasını beklersiniz; muhtemelen zaman aşımı süresini cURL kullanarak değiştirebilirsiniz.

İşte örnek:

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

Curl kullanıyorsanız, aşağıdaki komut dosyasını deneyebilirsiniz:

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

}

Referans URL: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/


1
burada bir zaman aşımına ihtiyacım var
Mike Q

1

bunu dene :

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

1

Görüntünüzün yolu uygulama köküne bağlıysa, aşağıdaki gibi bir şey kullanmak daha iyidir:

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

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

Bu işlev için kullanım örneği:

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

$exists = imgExists($path);

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

Farklı durumlar için uygulanabilir görüntünün varlığını kontrol etmek için kütüphane gibi bir şey yaratmanın iyi bir fikir olduğunu düşünüyorum. Bu görevi çözmek için kullanabileceğiniz birçok harika yanıtın üzerinde.


0

İlk 5 baytı HTTP'yi kullanarak okuyun fopen()ve fread()ardından şunu kullanın:

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

görüntüyü tespit etmek için.


genel bir 404 resmi olabilir
Your Common Sense

2
Evet - bu nedenle, belirtilen URL'de resim var.
Peter

0

file_existssadece dosyaları değil, yolları da okur. yani $filenameboş olduğunda , komut şu şekilde yazılmış gibi çalışır:

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

/ images / dizini varsa, işlev yine de geri dönecektir true.

Genelde şöyle yazıyorum:

// !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
}

0

file_exists($filepath) bir dizin ve tam dosya yolu için gerçek bir sonuç döndürecektir, bu nedenle bir dosya adı geçmediğinde her zaman bir çözüm olmayacaktır.

is_file($filepath) yalnızca tam dosya yolları için doğru döndürür


0

file_exists ile sunucu yoluna ihtiyacınız var

Örneğin

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.