PHP : 이미지 파일이 있는지 확인하는 방법은 무엇입니까?


97

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 2014

답변:


130

최소한 (문자열로) 따옴표로 묶인 파일 이름이 필요합니다.

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

또한 $filename올바르게 검증되었는지 확인하십시오. 그런 다음 allow_url_fopenPHP 구성에서이 활성화 된 경우에만 작동 합니다.


5
@GetImageSize를 사용하여 성공적으로 수행 할 수있었습니다. 그러나 서버 집약도가 덜한 것은 무엇입니까?
PaperChase 2011

9
file_exists ()는 URL이 아닌 하드 드라이브의 파일 경로를 사용해야합니다. 이것은 내게 유용한 대답이 아니므로 허용되는 것으로 설정해서는 안됩니다.
Martin

PHP에서 : bool file_exists (string $ filename) PHP 5.0.0부터이 함수는 일부 URL 래퍼와 함께 사용할 수도 있습니다. stat () 기능 군을 지원하는 래퍼를 확인하려면 지원되는 프로토콜 및 래퍼를 참조하세요.
Adrian P.

$ filename 문자열이 null이면 file_exists는 디렉토리에 대해 true를 반환합니다. is_file ($ filepath)을 사용하는 것이 더 좋습니다
PodTech.io 2017

1
사람들이 말했듯이 원격 URL / 경로에서는 작동하지 않습니다. 그러나 로컬 경로 (파일이있는 내부 서버 경로)에서 작동합니다. 또한 다른 방법에서 원격은 최대 14 초, 로컬은 1 초 미만 (특정 예의 경우)
Rafa

110
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:) false를 반환 함을 의미합니다.


1
if (@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
내 말은 사용자가 파일이 아닌 경로를 제공해도 작동한다는 것을 의미하며, 내 친구 파일이 아니더라도 함수는 true를 반환합니다.
Rizerzero 2015 년

흥미롭고 잠재적으로 중요한 차별화. 그러나 문서를 확인하면 file_exists와 함께 사용하지 않고이 목적을 위해 is_file 만 사용하면되는 것 같습니다.
Andrew

좋아요, (: PaperChase 사용) file_exists가 있는지 확인하고 싶어하지만, 그의 문제는 그가 함수에 대한 경로를 제공하더라도 진정한 응답을 얻을 수 있으므로 파일이 있는지 명확하게 확인하기 위해 그는 My function을 사용할 것입니다. php 함수는 경로가 전달 되어도 true를 반환하므로 함수 이름이 잘못되었으므로 Path_exists () 여야하며 My function 실제로 파일이 있는지 확인합니다. 기존 파일 경로 이외의 것은 전달됩니다. 나는 이것이 지금 명확하기를 바랍니다.
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

먼저 이해해야 할 사항 : 파일이 없습니다 .
파일은 파일 시스템 의 주제입니다. 이지만 URL 만 지원하는 HTTP 프로토콜을 사용하여 요청하고 있습니다.

따라서 브라우저를 사용하여 존재하지 않는 파일을 요청하고 응답 코드를 확인해야합니다. 404가 아니면 파일이 있는지 확인하기 위해 래퍼를 사용할 수 없으며 다른 프로토콜 (예 : FTP)을 사용하여 CDN을 요청해야합니다.


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

        return 0;           
    }

7

파일이 로컬 도메인에있는 경우 전체 URL을 입력 할 필요가 없습니다. 파일에 대한 경로 만. 파일이 다른 디렉토리에있는 경우 경로 앞에 "."를 붙여야합니다.

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

종종 "." 실제로있는 경우 파일이 존재하지 않는 것으로 표시됩니다.


3

is_file와 사이에는 큰 차이가 file_exists있습니다.

is_file (일반) 파일에 대해 true를 반환합니다.

반환 TRUE 파일 이름이 존재하고 일반 파일 인 경우 FALSE를 , 그렇지.

file_exists 파일과 디렉토리 모두에 대해 true를 반환합니다.

filename에 지정된 파일이나 디렉토리가 존재하면 TRUE를 반환 합니다 . 그렇지 않으면 FALSE 입니다.


참고 : 이 주제에 대한 자세한 내용 이 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 프레임 워크 용으로 작성하는 경우 내가 아는 한 모두 문서 루트 경로에 대해 상수를 정의했습니다.

예를 들어 WordPress는 사이트 URL뿐만 아니라 코드를 사용하여 서버의 파일 작업에 전역 적으로 사용할 수있는 ABSPATH를 사용합니다.

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

}

나는 여기에 여분의 마일을 갈거야 :). 이 코드는 유지 관리가 많이 필요하지 않고 상당히 견고하므로 짧은 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/


1
여기에 제한 시간 필요
마이크 Q

1

이 시도 :

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

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를 반환합니다.


0

file_exists가있는 서버 경로가 필요합니다.

예를 들면

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

0
if(@getimagesize($image_path)){
 ...}

나를 위해 일하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.