PHP: Bagaimana cara memeriksa apakah file gambar ada?

98

Saya perlu melihat apakah ada gambar tertentu di cdn saya.

Saya sudah mencoba yang berikut ini dan tidak berhasil:

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

Meskipun gambar tersebut ada atau tidak ada, selalu tertulis "File tersebut ada". Saya tidak yakin mengapa ini tidak berfungsi ...

PaperChase
sumber
1
Anda harus menggunakan jalur lengkap ke file di sistem file server Anda (misalnya '/home/you/public/img/sample.gif').
pengguna9440008
Berhati-hatilah dengan ini karena Anda mungkin menemukan melakukan file_existske lokasi terpencil akan sangat lambat.
crmpicco

Jawaban:

130

Anda memerlukan nama file setidaknya dalam tanda kutip (sebagai string):

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

Juga, pastikan $filenamedivalidasi dengan benar. Dan kemudian, ini hanya akan berfungsi ketika allow_url_fopendiaktifkan di konfigurasi PHP Anda

rajutan
sumber
5
Saya berhasil melakukannya dengan sukses menggunakan @GetImageSize. Namun, apa yang kurang intensif server?
PaperChase
9
file_exists () perlu menggunakan jalur file pada hard drive, bukan URL. Ini bukan jawaban yang berguna bagi saya, sebaiknya tidak disetel sebagai diterima.
Martin
Dari PHP: bool file_exists (string $ filename) Mulai dari PHP 5.0.0, fungsi ini juga dapat digunakan dengan beberapa pembungkus URL. Lihat Protokol dan Pembungkus yang Didukung untuk menentukan pembungkus mana yang mendukung kelompok fungsionalitas stat ().
Adrian P.
jika string $ filename adalah null maka file_exists akan mengembalikan true untuk direktori. Lebih baik menggunakan is_file ($ filepath)
PodTech.io
1
Seperti yang orang katakan, itu tidak berfungsi pada URL / jalur jarak jauh. Tetapi berfungsi di jalur lokal (jalur server internal tempat file berada). Juga, dari metode lain, jarak jauh membutuhkan waktu selama 14 detik, dan lokal, kurang dari 1 detik (untuk contoh tertentu)
Rafa
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Ini tidak berhasil untuk saya. Cara saya melakukannya menggunakan getimagesize.

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

if (@getimagesize($src)) {

Perhatikan bahwa '@' akan berarti bahwa jika gambar tidak ada (dalam hal ini fungsi biasanya akan menampilkan kesalahan :) getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: faileditu akan mengembalikan false.

Jeffrey Jenkinson
sumber
1
if (@getimagesize ($ src)) {bekerja dengan sangat baik, terima kasih, terima kasih tambahan atas penjelasan @ di sini
lesolorzanov

1
getimagesize () berfungsi, tetapi pastikan Anda menyertakan protokol di URI (misalnya, @getimagesize('//path/to/image.jpg')tidak akan berfungsi).
thdoan

file_exists atau is_file tidak berfungsi untuk saya, ini berhasil. Terima kasih!
Derk Jan Speelman

@getimagesize akan memperlambat pemuatan halaman secara dramatis. Tidak direkomendasikan. is_file dapat digunakan sebagai gantinya dan pastikan bahwa $ src bukan url lengkap: "http: // ..." tetapi "img / ..."
Bogdan C

is_file dan file_exists keduanya tidak berfungsi untuk gambar, tetapi @getimagesize berfungsi dengan baik.
Alam Zaib

14

Yah, file_existstidak mengatakan jika sebuah file ada, ia mengatakan jika sebuah jalur ada . ⚡⚡⚡⚡⚡⚡⚡

Jadi, untuk memeriksa apakah itu file maka Anda harus menggunakan is_filebersama dengan file_existsuntuk mengetahui apakah benar-benar ada file di belakang jalur, jika tidak file_existsakan kembali trueke jalur yang ada.

Inilah fungsi yang saya gunakan:

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

2
Bagaimana mungkin ada jalur yang ada, tetapi file tidak ada, jika jalur tersebut berisi nama file?
Andrew

1
Maksud saya itu bahkan berfungsi jika pengguna memberikan jalur dan bukan file, fungsi akan mengembalikan true meskipun itu bukan file teman saya.
Rizerzero

Diferensiasi yang menarik dan berpotensi penting untuk dibuat. Tetapi jika Anda memeriksa dokumennya, sepertinya Anda hanya perlu menggunakan is_file untuk tujuan ini, dan tidak terkait dengan file_exists.
Andrew

ok izinkan saya menyimpulkan ini untuk Anda, (gunakan: PaperChase) ingin memeriksa apakah file_exists, masalahnya adalah bahwa bahkan jika dia memberikan jalur ke fungsi dia akan mendapatkan respons yang benar, jadi untuk memeriksa dengan jelas apakah file itu ada, maka dia akan menggunakan fungsi saya, karena fungsi php akan mengembalikan nilai true meskipun jalur dilewati, jadi nama fungsinya buruk, itu harus Path_exists () dan fungsi saya benar-benar memeriksa apakah ada file, karena akan mengembalikan false jika apa pun selain jalur file yang ada dilewatkan. Saya harap ini jelas sekarang.
Rizerzero

Ya itu akan berfungsi dengan baik, tetapi menurut php.net/manual/en/function.is-file.php is_file () sudah memeriksa apakah jalur / file ada sebelum memeriksa apakah itu file, jadi Anda tidak perlu .
Andrew

13

Coba seperti ini:

$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

Berikut adalah cara termudah untuk memeriksa apakah suatu file ada:

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

8

Satu hal yang harus Anda pahami terlebih dahulu: Anda tidak memiliki file .
File adalah subjek dari sistem file , tetapi Anda membuat permintaan menggunakan protokol HTTP yang tidak mendukung file selain URL.

Jadi, Anda harus meminta file yang tidak ada menggunakan browser Anda dan melihat kode respons. jika bukan 404, Anda tidak dapat menggunakan pembungkus apa pun untuk melihat apakah ada file dan Anda harus meminta cdn Anda menggunakan beberapa protokol lain, misalnya FTP


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

        return 0;           
    }

7

Jika file ada di domain lokal Anda, Anda tidak perlu memasukkan URL lengkapnya. Hanya jalur ke file tersebut. Jika file berada di direktori yang berbeda, maka Anda perlu mengawali jalur dengan "."

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

Sering kali "." dibiarkan yang akan menyebabkan file ditampilkan sebagai tidak ada, padahal sebenarnya ada.


3

Ada perbedaan besar antara is_filedan file_exists.

is_file mengembalikan nilai true untuk file (biasa):

Mengembalikan TRUE jika nama file ada dan merupakan file biasa, FALSE sebaliknya.

file_exists mengembalikan nilai true untuk file dan direktori:

Mengembalikan TRUE jika file atau direktori yang ditentukan oleh nama file ada; SALAH sebaliknya.


Catatan: Periksa juga pertanyaan stackoverflow ini untuk informasi lebih lanjut tentang topik ini.


2

Anda harus menggunakan jalur absolut untuk melihat apakah file tersebut ada.

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

}

Jika Anda menulis untuk CMS atau kerangka PHP maka sejauh yang saya tahu semuanya telah mendefinisikan konstan untuk jalur root dokumen.

misalnya WordPress menggunakan ABSPATH yang dapat digunakan secara global untuk bekerja dengan file di server menggunakan kode Anda serta url situs.

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

}

Saya akan bekerja ekstra di sini :). Karena kode ini tidak memerlukan banyak perawatan dan cukup solid, saya akan menuliskannya dengan pernyataan singkat 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';

Pernyataan singkat IF menjelaskan:

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

2

Anda bisa menggunakan cURL. Anda bisa mendapatkan cURL untuk hanya memberi Anda header, dan bukan isi, yang mungkin membuatnya lebih cepat. Domain yang buruk selalu membutuhkan waktu beberapa saat karena Anda akan menunggu permintaan waktu habis; Anda mungkin dapat mengubah durasi waktu tunggu menggunakan cURL.

Berikut contohnya:

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

Jika Anda menggunakan curl, Anda dapat mencoba skrip berikut:

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 Referensi: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/

Yogi Ghorecha
1
perlu waktu tunggu di sini
Mike Q
mungkin ada gambar 404 generik
Akal Sehat Anda
2
Ya - jadi gambar ada di URL yang ditentukan.
Peter
1

coba ini :

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

Jika path ke gambar Anda relatif terhadap root aplikasi, lebih baik menggunakan sesuatu seperti ini:

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

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

Contoh penggunaan untuk fungsi ini:

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

$exists = imgExists($path);

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

Saya pikir itu ide yang baik untuk membuat sesuatu seperti perpustakaan untuk memeriksa keberadaan gambar yang berlaku untuk situasi yang berbeda. Di atas banyak jawaban bagus yang dapat Anda gunakan untuk menyelesaikan tugas ini.

B. Bohdan
sumber
0

Baca 5 byte pertama dari HTTP menggunakan fopen()dan fread()kemudian gunakan ini:

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

untuk mendeteksi gambar.

Peter
sumber
mungkin ada gambar 404 generik
Akal Sehat Anda
2
Ya - jadi gambar ada di URL yang ditentukan.
Peter
0

file_existstidak hanya membaca file, tetapi juga jalur. jadi ketika $filenamekosong, perintah akan berjalan seperti jika ditulis seperti ini:

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

jika direktori / gambar / ada, fungsi tersebut akan tetap kembali true.

Saya biasanya menulisnya seperti ini:

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

file_exists($filepath) akan mengembalikan hasil yang benar untuk direktori dan jalur file penuh, jadi tidak selalu merupakan solusi ketika nama file tidak dikirimkan.

is_file($filepath) hanya akan mengembalikan true untuk jalur file sepenuhnya

PodTech.io
sumber
0

Anda membutuhkan jalur server dengan file_exists

sebagai contoh

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

Bekerja untuk saya.

Safeer Ahmed
sumber