2013-02-11 29 views
5

Điều này phun ra toàn bộ đống NO nhưng hình ảnh ở đó và đường dẫn chính xác khi chúng được hiển thị bởi <img>.Làm cách nào để kiểm tra xem tệp hình ảnh từ xa có tồn tại trong php không?

foreach ($imageNames as $imageName) 
{ 
    $image = 'http://path/' . $imageName . '.jpg'; 
    if (file_exists($image)) { 
     echo 'YES'; 
    } else { 
     echo 'NO'; 
    } 
    echo '<img src="' . $image . '">'; 
} 
+2

URL của tệp hình ảnh và đường dẫn đến cùng một tệp hình ảnh trên hệ thống tệp của máy chủ là ** hai chuỗi khác nhau **. –

+0

Ok có ý nghĩa. Tôi đã bị lừa dối bởi lướt qua các bài viết khác bằng cách sử dụng đường dẫn từ xa với file_exists. – TijuanaKez

Trả lời

13

file_exists sử dụng con đường địa phương, không phải là một URL.

Một giải pháp sẽ là:

$url=getimagesize(your_url); 

if(!is_array($url)) 
{ 
    // The image doesn't exist 
} 
else 
{ 
    // The image exists 
} 

Xem này để biết thêm information.

Ngoài ra, tìm kiếm tiêu đề phản hồi (sử dụng chức năng get_headers) sẽ là giải pháp thay thế tốt hơn. Chỉ cần kiểm tra nếu các phản ứng là 404:

if(@get_headers($your_url)[0] == 'HTTP/1.1 404 Not Found') 
{ 
    // The image doesn't exist 
} 
else 
{ 
    // The image exists 
} 
+3

Điều này rất tốn kém. Toàn bộ hình ảnh được tải xuống trước khi thông tin được truy xuất. Bạn tốt hơn là chỉ cần nhìn vào các tiêu đề của yêu cầu của bạn. Nhìn vào get_headers(). http://php.net/manual/en/function.get-headers.php –

+0

@GeneKelly Cảm ơn! Đã cập nhật. –

+0

Đó là một câu trả lời tuyệt vời (với các tiêu đề). Nhưng nó luôn luôn trả về cùng một tiêu đề trên các máy chủ khác nhau? Xin lỗi vì sự thiếu hiểu biết của tôi về điều này. – itsols

13

file_exists tìm kiếm một con đường địa phương, không phải là một "http: //" URL

sử dụng:

$file = 'http://www.domain.com/somefile.jpg'; 
$file_headers = @get_headers($file); 
if($file_headers[0] == 'HTTP/1.1 404 Not Found') { 
    $exists = false; 
} 
else { 
    $exists = true; 
} 
+0

@Phil bạn đã thử với URL chưa? Nó trả về false: http://codepad.viper-7.com/56dDzt – Mike

+0

nếu máy chủ trả về: HTTP/1.1 403? – realization

+0

Nếu đó là 403, hình ảnh vẫn không thể truy cập, nhưng tồn tại. –

2
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if($retcode==200) echo 'YES'; 
else    echo 'NO'; 
+1

Vui lòng giải thích mã của bạn một chút – andy

0
function remote_file_exists($file){ 

$url=getimagesize($file); 

if(is_array($url)) 
{ 

return true; 

} 
else { 

return false; 

} 

$file='http://www.site.com/pic.jpg'; 

echo remote_file_exists($file); // return true if found and if not found it will return false 
1

Đây là những gì tôi đã làm. Nó bao gồm nhiều kết quả có thể hơn với việc nhận tiêu đề vì nếu bạn không thể truy cập tệp, nó không phải lúc nào cũng chỉ là "404 Không tìm thấy". Đôi khi đó là "Đã chuyển vĩnh viễn", "Bị cấm" và các tin nhắn khác có thể. Tuy nhiên nó chỉ là "200 OK" nếu tập tin tồn tại, và có thể được truy cập. Các phần với HTTP có thể có 1,1, hoặc 1.0 sau đó, đó là lý do tại sao tôi chỉ sử dụng strpos là đáng tin cậy hơn cho mọi tình huống.

$file_headers = @get_headers('http://example.com/image.jpg'); 

$is_the_file_accessable = true; 

if(strpos($file_headers[0], ' 200 OK') !== false){ 
    $is_the_file_accessable = false; 
} 

if($is_the_file_accessable){ 
    // THE IMAGE CAN BE ACCESSED. 
} 
else 
{ 
    // THE IMAGE CANNOT BE ACCESSED. 
} 
Các vấn đề liên quan