PHP: จะตรวจสอบได้อย่างไรว่ามีไฟล์รูปภาพอยู่หรือไม่?


100

ฉันต้องการดูว่ามีภาพเฉพาะใน cdn ของฉันหรือไม่

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่ได้ผล:

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

แม้ว่ารูปภาพนั้นจะมีอยู่หรือไม่มีอยู่ แต่จะมีข้อความว่า "มีไฟล์อยู่" เสมอ ฉันไม่แน่ใจว่าทำไมมันถึงใช้งานไม่ได้ ...


1
คุณควรใช้เส้นทางแบบเต็มไปยังไฟล์ในระบบไฟล์เซิร์ฟเวอร์ของคุณ (เช่น '/home/you/public/img/sample.gif')
user9440008

ระวังด้วยเพราะคุณอาจพบว่าการfile_existsไปยังสถานที่ห่างไกลจะช้ามาก
crmpicco

คำตอบ:


131

คุณต้องมีชื่อไฟล์ในเครื่องหมายคำพูดเป็นอย่างน้อย (เป็นสตริง):

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

ตรวจสอบให้แน่ใจว่า$filenameได้รับการตรวจสอบอย่างถูกต้อง จากนั้นจะallow_url_fopenใช้งานได้ก็ต่อเมื่อเปิดใช้งานในการกำหนดค่า PHP ของคุณ


5
ฉันสามารถทำได้สำเร็จโดยใช้ @GetImageSize อย่างไรก็ตามสิ่งที่จะน้อยกว่าเซิร์ฟเวอร์เข้มข้น?
PaperChase

9
file_exists () จำเป็นต้องใช้เส้นทางไฟล์บนฮาร์ดไดรฟ์ไม่ใช่ URL คำตอบนี้ไม่มีประโยชน์สำหรับฉันไม่ควรตั้งค่าเป็นยอมรับ
Martin

จาก PHP: bool file_exists (string $ filename) ตั้งแต่ PHP 5.0.0 ฟังก์ชันนี้ยังสามารถใช้กับ URL wrapper บางตัวได้ โปรดดูโปรโตคอลและ Wrappers ที่สนับสนุนเพื่อพิจารณาว่า Wrapper ใดสนับสนุนกลุ่มฟังก์ชันการทำงานของ stat ()
Adrian P.

ถ้าสตริง $ filename เป็น null file_exists จะส่งคืนจริงสำหรับไดเร็กทอรี ใช้ is_file ดีกว่า ($ filepath)
PodTech.io

1
ตามที่ผู้คนกล่าวไว้มันใช้ไม่ได้กับ URL / เส้นทางระยะไกล แต่ใช้งานได้ในโลคัลพา ธ (เส้นทางเซิร์ฟเวอร์ภายในที่มีไฟล์อยู่) นอกจากนี้จากวิธีการอื่น ๆ ระยะไกลใช้เวลานานถึง 14 วินาทีและในพื้นที่น้อยกว่า 1 วินาที (สำหรับตัวอย่าง)
Rafa

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

สิ่งนี้ไม่ได้ผลสำหรับฉัน วิธีที่ฉันทำคือใช้ getimagesize

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

if (@getimagesize($src)) {

โปรดทราบว่า '@' จะหมายความว่าหากไม่มีรูปภาพ (ซึ่งในกรณีนี้ฟังก์ชันมักจะทำให้เกิดข้อผิดพลาด :) getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failedมันจะส่งคืนเท็จ


1
ถ้า (@getimagesize ($ src)) {ทำงานได้อย่างมหัศจรรย์ขอบคุณขอบคุณสำหรับคำอธิบายของ @ ที่นี่
lesolorzanov

1
getimagesize () ใช้งานได้ แต่ตรวจสอบให้แน่ใจว่าคุณรวมโปรโตคอลใน URI (เช่น@getimagesize('//path/to/image.jpg')จะใช้ไม่ได้)
thdoan

file_exists หรือ is_file ใช้ไม่ได้สำหรับฉันสิ่งนี้ทำ ขอบคุณ!
Derk Jan Speelman

@getimagesize จะทำให้การโหลดหน้าเว็บช้าลงอย่างมาก ไม่แนะนำ. is_file สามารถใช้แทนได้และตรวจสอบให้แน่ใจว่า $ src ไม่ใช่ url แบบเต็ม: "http: // ... " แต่ "img / ... "
Bogdan C

is_file และ file_exists ไม่ทำงานกับรูปภาพ แต่ @getimagesize ทำงานได้ดี
Alam Zaib

14

ดีfile_existsไม่ได้บอกว่าไฟล์ที่มีอยู่มันบอกว่าถ้าเส้นทางที่มีอยู่ ⚡⚡⚡⚡⚡⚡⚡

ดังนั้นเพื่อตรวจสอบว่าเป็นไฟล์หรือไม่คุณควรใช้is_fileร่วมกับ file_existsเพื่อให้ทราบว่ามีไฟล์อยู่เบื้องหลังเส้นทางหรือไม่มิฉะนั้นfile_existsจะกลับมาtrueสำหรับเส้นทางที่มีอยู่

นี่คือฟังก์ชั่นที่ฉันใช้:

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

2
จะมีพา ธ อยู่ได้อย่างไร แต่ไฟล์ไม่มีอยู่เมื่อพา ธ มีชื่อไฟล์
Andrew

1
ฉันหมายความว่ามันใช้งานได้แม้ว่าผู้ใช้จะให้พา ธ ไม่ใช่ไฟล์ฟังก์ชันนี้จะคืนค่าจริงแม้ว่าจะไม่ใช่ไฟล์ที่เป็นเพื่อนของฉันก็ตาม
Rizerzero

การสร้างความแตกต่างที่น่าสนใจและอาจมีความสำคัญ แต่ถ้าคุณตรวจสอบเอกสารดูเหมือนว่าคุณจะต้องใช้ is_file เพื่อจุดประสงค์นี้เท่านั้นและไม่ได้ใช้ร่วมกับ file_exists
Andrew

ตกลงให้ฉันสรุปให้คุณ (ใช้: PaperChase) ต้องการตรวจสอบว่า file_exists หรือไม่ปัญหาของเขาคือแม้ว่าเขาจะให้เส้นทางไปยังฟังก์ชันเขาก็จะได้รับการตอบสนองที่แท้จริงดังนั้นเพื่อตรวจสอบให้ชัดเจนว่ามีไฟล์อยู่หรือไม่ เขาจะใช้ฟังก์ชันของฉันเนื่องจากฟังก์ชัน php จะคืนค่าจริงแม้ว่าจะมีการส่งเส้นทางดังนั้นชื่อฟังก์ชันจึงไม่ถูกต้องควรเป็น Path_exists () และฟังก์ชันของฉันจะตรวจสอบว่ามีไฟล์อยู่จริงหรือไม่เพราะมันจะส่งคืนเป็นเท็จถ้า สิ่งอื่นที่ไม่ใช่เส้นทางไฟล์ที่มีอยู่จะถูกส่งผ่าน ฉันหวังว่าตอนนี้จะชัดเจนแล้ว
Rizerzero

ใช่มันจะใช้งานได้ดี แต่อ้างอิงจากphp.net/manual/en/function.is-file.php is_file () แล้วตรวจสอบว่าเส้นทาง / ไฟล์มีอยู่ก่อนที่จะตรวจสอบว่าเป็นไฟล์หรือไม่ดังนั้นคุณไม่จำเป็นต้อง .
Andrew

13

ลองทำดังนี้

$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

นี่คือวิธีที่ง่ายที่สุดในการตรวจสอบว่ามีไฟล์อยู่หรือไม่:

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

8

สิ่งที่คุณต้องเข้าใจก่อน: คุณมีไฟล์ไม่มี
ไฟล์เป็นเรื่องของระบบไฟล์แต่คุณกำลังส่งคำขอโดยใช้โปรโตคอล HTTP ซึ่งไม่รองรับไฟล์ใด ๆ แต่เป็น URL

ดังนั้นคุณต้องขอไฟล์ที่ไม่มีอยู่โดยใช้เบราว์เซอร์ของคุณและดูรหัสตอบกลับ ถ้าไม่ใช่ 404 คุณจะไม่สามารถใช้ Wrapper เพื่อดูว่ามีไฟล์อยู่หรือไม่และคุณต้องขอ cdn ของคุณโดยใช้โปรโตคอลอื่น ๆ เช่น FTP



7

หากไฟล์อยู่ในโดเมนท้องถิ่นของคุณคุณไม่จำเป็นต้องใส่ URL แบบเต็ม เฉพาะเส้นทางไปยังไฟล์ หากไฟล์อยู่ในไดเร็กทอรีอื่นคุณจะต้องนำหน้าเส้นทางด้วย "."

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

บ่อยครั้งที่ "." ค้างไว้ซึ่งจะทำให้ไฟล์แสดงเป็นไม่มีอยู่จริงเมื่อเป็นเช่นนั้น


3

มีความแตกต่างที่สำคัญระหว่างเป็นและis_filefile_exists

is_file คืนค่าจริงสำหรับไฟล์ (ปกติ):

ผลตอบแทน TRUEถ้าชื่อไฟล์ที่มีอยู่และเป็นไฟล์ปกติFALSEมิฉะนั้น

file_exists คืนค่าจริงสำหรับทั้งไฟล์และไดเร็กทอรี:

ผลตอบแทน TRUEหากไฟล์หรือไดเร็กทอรีที่ระบุโดยชื่อไฟล์มีอยู่ เป็นเท็จอย่างอื่น


หมายเหตุ: ตรวจสอบคำถาม stackoverflow นี้ด้วยสำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้


2

คุณต้องใช้เส้นทางสัมบูรณ์เพื่อดูว่ามีไฟล์อยู่หรือไม่

$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 หรือ PHP framework เท่าที่ฉันรู้ว่าทั้งหมดได้กำหนดค่าคงที่สำหรับเส้นทางรูทของเอกสาร

เช่น WordPress ใช้ ABSPATH ซึ่งสามารถใช้ได้ทั่วโลกสำหรับการทำงานกับไฟล์บนเซิร์ฟเวอร์โดยใช้รหัสของคุณและ URL ของไซต์

ตัวอย่าง 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";

}

ฉันจะไปอีกไมล์ที่นี่ :) เนื่องจากรหัสนี้ไม่ต้องการการบำรุงรักษามากนักและค่อนข้างมั่นคงฉันจะเขียนด้วยคำสั่ง shorthand 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';

คำสั่งชวเลข IF อธิบาย:

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

2

คุณสามารถใช้ cURL คุณสามารถรับ cURL เพื่อให้เฉพาะส่วนหัวเท่านั้นไม่ใช่ส่วนหัวซึ่งอาจทำให้เร็วขึ้น โดเมนที่ไม่ดีอาจใช้เวลาสักครู่เนื่องจากคุณจะรอให้คำขอหมดเวลา คุณอาจเปลี่ยนระยะหมดเวลาโดยใช้ cURL

นี่คือตัวอย่าง:

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 คุณสามารถลองใช้สคริปต์ต่อไปนี้:

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


2
ต้องหมดเวลาที่นี่
Mike Q


1

หากเส้นทางไปยังรูปภาพของคุณสัมพันธ์กับรูทแอปพลิเคชันควรใช้สิ่งนี้:

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

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

ตัวอย่างการใช้งานสำหรับฟังก์ชันนี้:

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

$exists = imgExists($path);

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

ฉันคิดว่าเป็นความคิดที่ดีที่จะสร้างบางสิ่งเช่นไลบรารีเพื่อตรวจสอบการมีอยู่ของรูปภาพที่ใช้ได้กับสถานการณ์ต่างๆ เหนือคำตอบที่ยอดเยี่ยมมากมายที่คุณสามารถใช้เพื่อแก้ปัญหานี้


0

อ่านครั้งแรก 5 ไบต์แบบ HTTP ใช้fopen()และfread()จากนั้นใช้นี้

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

เพื่อตรวจจับภาพ


อาจมีภาพ 404 ทั่วไป
สามัญสำนึกของคุณ

2
ใช่ - ดังนั้นภาพจึงมีอยู่ใน URL ที่ระบุ
Peter

0

file_existsไม่เพียงอ่านไฟล์เท่านั้น แต่ยังอ่านเส้นทางด้วย ดังนั้นเมื่อ$filenameใดที่ว่างคำสั่งจะทำงานราวกับว่ามันเขียนไว้ดังนี้:

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

ถ้าไดเรกทอรี / images / trueอยู่ฟังก์ชั่นจะยังคงกลับมา

ฉันมักจะเขียนแบบนี้:

// !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) จะส่งคืนผลลัพธ์ที่แท้จริงสำหรับไดเร็กทอรีและพา ธ ไฟล์แบบเต็มดังนั้นจึงไม่ใช่วิธีแก้ปัญหาเสมอไปเมื่อไม่ได้ส่งชื่อไฟล์

is_file($filepath) จะคืนค่า true สำหรับ filepaths แบบเต็มเท่านั้น



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.