PHP: Làm thế nào để kiểm tra xem tệp hình ảnh có tồn tại hay không?


97

Tôi cần xem liệu một hình ảnh cụ thể có tồn tại trên cdn của tôi hay không.

Tôi đã thử những cách sau và nó không hoạt động:

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

Ngay cả khi hình ảnh tồn tại hoặc không tồn tại, nó vẫn luôn thông báo "Tệp tồn tại". Tôi không chắc tại sao nó không hoạt động ...


1
Bạn nên sử dụng đường dẫn đầy đủ đến tệp trong hệ thống tệp máy chủ của mình (ví dụ: '/home/you/public/img/sample.gif').
user9440008

Hãy cẩn thận với điều này vì bạn có thể thấy việc thực hiện một file_existsvị trí từ xa sẽ rất chậm.
crmpicco

Câu trả lời:


130

Bạn cần ít nhất tên tệp trong dấu ngoặc kép (dưới dạng chuỗi):

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

Ngoài ra, hãy chắc chắn rằng đã $filenameđược xác thực đúng cách. Và sau đó, nó sẽ chỉ hoạt động khi allow_url_fopenđược kích hoạt trong cấu hình PHP của bạn


5
Tôi đã có thể thực hiện thành công bằng cách sử dụng @GetImageSize. Tuy nhiên, những gì sẽ ít máy chủ hơn?
PaperChase

9
file_exists () cần sử dụng đường dẫn tệp trên ổ cứng, không phải URL Đây không phải là câu trả lời hữu ích đối với tôi, không nên được đặt là được chấp nhận.
Martin

Từ PHP: bool file_exists (string $ filename) Kể từ phiên bản PHP 5.0.0, hàm này cũng có thể được sử dụng với một số trình bao bọc URL. Tham khảo Giao thức được hỗ trợ và Trình bao bọc để xác định trình bao bọc nào hỗ trợ họ chức năng stat ().
Adrian P.

nếu chuỗi $ filename là null thì file_exists sẽ trả về true cho thư mục. Tốt hơn để sử dụng is_file ($ filepath)
PodTech.io

1
Như mọi người đã nói, nó không hoạt động trên URL / đường dẫn từ xa. Nhưng nó hoạt động trong các đường dẫn cục bộ (đường dẫn máy chủ nội bộ nơi chứa các tệp). Ngoài ra, so với các phương pháp khác, điều khiển từ xa mất tới 14 giây và cục bộ, ít hơn 1 giây (đối với một số ví dụ nhất định)
Rafa

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

Điều này không hiệu quả với tôi. Cách tôi đã làm là sử dụng kích thước địa lý.

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

if (@getimagesize($src)) {

Lưu ý rằng '@' sẽ có nghĩa là nếu hình ảnh không tồn tại (trong trường hợp đó, hàm thường thông báo lỗi getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed:) thì nó sẽ trả về false.


1
if (@getimagesize ($ src)) {công trình kỳ diệu, cảm ơn bạn, đặc biệt cảm ơn bạn vì lời giải thích của @ đây
lesolorzanov

1
getimagesize () hoạt động, nhưng hãy đảm bảo rằng bạn bao gồm giao thức trong URI (ví dụ: @getimagesize('//path/to/image.jpg')sẽ không hoạt động).
thdoan

file_exists hoặc is_file không làm việc cho tôi, điều này đã làm. cảm ơn bạn!
Derk Jan Speelman

@getimagesize sẽ làm chậm quá trình tải trang một cách đáng kể. Không được khuyến khích. is_file thể được sử dụng để thay thế và đảm bảo rằng $ src chưa đầy url: "http: // ..." nhưng "img / ..."
Bogdan C

is_file và file_exists đều không hoạt động với hình ảnh, nhưng @getimagesize thì hoạt động tốt.
Alam Zaib

14

Chà, file_existskhông cho biết tệp có tồn tại hay không, nó cho biết có tồn tại đường dẫn hay không . ⚡⚡⚡⚡⚡⚡⚡

Vì vậy, để kiểm tra xem nó có phải là một tệp hay không thì bạn nên sử dụng is_filecùng với file_existsđể biết liệu có thực sự là tệp đằng sau đường dẫn hay không, nếu không file_existssẽ trả về truecho bất kỳ đường dẫn hiện có nào.

Đây là chức năng tôi sử dụng:

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

2
Làm thế nào có thể có một đường dẫn tồn tại, nhưng tệp không tồn tại, khi đường dẫn chứa tên tệp?
Andrew

1
ý tôi là nó thậm chí hoạt động nếu người dùng đưa ra một đường dẫn chứ không phải một tệp, hàm sẽ trả về true ngay cả khi nó không phải là tệp bạn của tôi.
Rizerzero

Sự khác biệt thú vị và có khả năng quan trọng để thực hiện. Nhưng nếu bạn kiểm tra tài liệu, có vẻ như bạn chỉ cần sử dụng is_file cho mục đích này và không kết hợp với file_exists.
Andrew

Được rồi, hãy để tôi tóm tắt điều này cho bạn, (sử dụng: PaperChase) muốn kiểm tra xem tệp có tồn tại hay không, vấn đề của anh ta là ngay cả khi anh ta đưa ra một đường dẫn đến hàm, anh ta sẽ nhận được phản hồi đúng, vì vậy để kiểm tra rõ ràng xem tệp có tồn tại hay không anh ta sẽ sử dụng hàm của tôi, bởi vì hàm php sẽ trả về true ngay cả khi một đường dẫn được chuyển qua, vì vậy tên hàm không hợp lệ, nó phải là Path_exists () và hàm của tôi có thực sự kiểm tra xem tệp có tồn tại hay không, vì nó sẽ trả về false nếu một bất kỳ thứ gì khác ngoài đường dẫn tệp hiện có được chuyển. tôi hy vọng điều này là rõ ràng ngay bây giờ.
Rizerzero

Có nó sẽ làm việc tốt, nhưng theo php.net/manual/en/function.is-file.php is_file () đã kiểm tra nếu path / tập tin tồn tại trước khi kiểm tra nếu nó là một tập tin, vì vậy bạn không cần phải .
Andrew

13

Hãy thử như thế này:

$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

Đây là cách đơn giản nhất để kiểm tra xem tệp có tồn tại hay không:

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

8

Một điều bạn phải hiểu trước: bạn không có tệp nào .
Tệp là một chủ thể của hệ thống tệp , nhưng bạn đang thực hiện yêu cầu của mình bằng giao thức HTTP không hỗ trợ tệp ngoài URL.

Vì vậy, bạn phải yêu cầu một tệp không tồn tại bằng trình duyệt của mình và xem mã phản hồi. nếu nó không phải là 404, bạn không thể sử dụng bất kỳ trình bao bọc nào để xem liệu tệp có tồn tại hay không và bạn phải yêu cầu cdn của mình bằng một số giao thức khác, chẳng hạn như FTP


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

        return 0;           
    }

7

Nếu tệp nằm trên miền cục bộ của bạn, bạn không cần đặt URL đầy đủ. Chỉ đường dẫn đến tệp. Nếu tệp nằm trong một thư mục khác, thì bạn cần đặt trước đường dẫn bằng "."

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

Thường thì dấu "." bị tắt, điều này sẽ khiến tệp được hiển thị là không tồn tại, trong khi thực tế là như vậy.


3

Có một sự khác biệt lớn giữa is_filefile_exists.

is_file trả về true cho các tệp (thông thường):

Trả về TRUE nếu tên tệp tồn tại và là tệp thông thường, nếu không trả về FALSE .

file_exists trả về true cho cả tệp và thư mục:

Trả về TRUE nếu tồn tại tệp hoặc thư mục được chỉ định bởi tên tệp; FALSE nếu không.


Lưu ý: Cũng kiểm tra câu hỏi stackoverflow này để biết thêm thông tin về chủ đề này.


2

Bạn phải sử dụng đường dẫn tuyệt đối để xem liệu tệp có tồn tại hay không.

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

}

Nếu bạn đang viết cho CMS hoặc PHP framework thì theo như tôi biết, tất cả chúng đều đã định nghĩa hằng số cho đường dẫn gốc của tài liệu.

ví dụ: WordPress sử dụng ABSPATH có thể được sử dụng trên toàn cầu để làm việc với các tệp trên máy chủ bằng cách sử dụng mã của bạn cũng như url trang web.

Ví dụ về 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";

}

Tôi đang đi thêm một dặm ở đây :). Bởi vì mã này sẽ không cần bảo trì nhiều và khá chắc chắn, tôi sẽ viết nó bằng câu lệnh if viết tắt:

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

Câu lệnh IF viết tắt được giải thích:

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

2

bạn có thể sử dụng cURL. Bạn có thể nhận cURL để chỉ cung cấp cho bạn phần tiêu đề chứ không phải phần nội dung, điều này có thể làm cho nó nhanh hơn. Một miền không hợp lệ luôn có thể mất một khoảng thời gian vì bạn sẽ chờ yêu cầu hết thời gian chờ; bạn có thể thay đổi thời lượng chờ bằng cURL.

Đây là ví dụ:

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

Nếu bạn đang sử dụng curl, bạn có thể thử tập lệnh sau:

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


1
cần thời gian chờ ở đây
Mike Q

1

thử cái này :

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

1

Nếu đường dẫn đến hình ảnh của bạn có liên quan đến gốc ứng dụng, tốt hơn nên sử dụng một cái gì đó như sau:

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

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

Ví dụ sử dụng cho chức năng này:

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

$exists = imgExists($path);

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

Tôi nghĩ rằng nên tạo một thứ gì đó như thư viện để kiểm tra sự tồn tại của hình ảnh có thể áp dụng cho các trường hợp khác nhau. Trên đây là rất nhiều câu trả lời tuyệt vời mà bạn có thể sử dụng để giải quyết công việc này.


0

Đọc 5 byte biểu mẫu HTTP đầu tiên bằng cách sử dụng fopen()fread()sau đó sử dụng:

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

để phát hiện hình ảnh.


có thể có một hình ảnh 404 chung chung
Your Common Sense

2
Có - vì vậy hình ảnh tồn tại trên URL được chỉ định.
Peter

0

file_existskhông chỉ đọc các tệp mà còn đọc các đường dẫn. vì vậy khi $filenamenào trống, lệnh sẽ chạy như thể nó được viết như thế này:

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

nếu thư mục / hình ảnh / tồn tại, hàm vẫn sẽ trả về true.

Tôi thường viết nó như thế này:

// !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) sẽ trả về kết quả true cho một thư mục và đường dẫn tệp đầy đủ, vì vậy không phải lúc nào cũng là giải pháp khi tên tệp không được chuyển.

is_file($filepath) sẽ chỉ trả về true cho các đường dẫn tệp đầy đủ


0

bạn cần đường dẫn máy chủ với file_exists

ví dụ

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.