2012-05-19 57 views
10

Tôi có thể kiểm tra xem một tệp nào đó có phải là hình ảnh không? Làm thế nào có thể làm điều này trong PHP?Làm cách nào để kiểm tra xem tệp có phải là hình ảnh không?

Nếu tệp không phải là hình ảnh, tôi muốn đưa ra một thông báo cảnh báo.

+1

nhiều câu hỏi tương tự đã được hỏi về SO ... Xin vui lòng thử tìm kiếm –

+0

@MitchWheat: tôi tìm kiếm nhưng tôi không thể tìm đúng cách để kiểm tra và thực hiện. – pratik

+0

do u duyệt và nhập tệp hay đọc tệp trực tiếp từ một nguồn cụ thể? – sree

Trả lời

1

trong PHP bạn có thể làm điều đó như sau cách

if ((($_FILES['profile_picture']['type'] == 'image/gif') || ($_FILES['profile_picture']['type'] == 'image/jpeg') || ($_FILES['profile_picture']['type'] == 'image/png'))) 

trong Javascript Bạn có thể làm điều đó như sau cách

function checkFile() { 
    var filename = document.getElementById("upload_file").value; 
    var ext = getExt(filename); 
// alert(filename.files[0].filesize); 
    // alert(ext); 
    if(ext == "gif" || ext == "jpg" || ext=="png") 
     return true; 
    alert("Please upload .gif, .jpg and .png files only."); 
    document.getElementById("upload_file").value=''; 
    return false; 
} 

function getExt(filename) { 
    var dot_pos = filename.lastIndexOf("."); 
    if(dot_pos == -1) 
     return ""; 
    return filename.substr(dot_pos+1).toLowerCase(); 
} 
+1

Tôi chắc chắn rằng anh ấy cần kiểm tra xem liệu tệp không chỉ đổi tên thành sheet.pdf thành sheet.jpg. Bạn hiểu ý tôi. –

+0

có, điểm tốt – mack

+0

Tôi sẽ xóa bỏ phiếu giảm giá của mình. Xin lỗi anyway;) –

5

Ngoài getimagesize(), bạn có thể sử dụng exif_imagetype()

exif_imagetype() đọc các byte đầu tiên của một hình ảnh và kiểm tra chữ ký của nó.

Khi tìm thấy chữ ký chính xác, giá trị không đổi thích hợp sẽ được trả về nếu không giá trị trả về là FALSE. Giá trị trả về là cùng một giá trị getimagesize() trả về trong chỉ mục 2 nhưng exif_imagetype() nhanh hơn nhiều.

Đối với cả hai hàm, FALSE được trả về nếu tệp không được xác định là hình ảnh.

+0

-1 - Cả hai chức năng này đều ném lỗi đọc, ít nhất là 5.3. – MikeSchinkel

+0

@MikeSchinkel Vui lòng làm rõ. –

+0

Ví dụ [tại đây] (http://stackoverflow.com/questions/1363876/handle-error-when-getimagesize-cant-find-file) và [tại đây] (http://stackoverflow.com/questions/10175758/ getimagesize-read-error). Trong trường hợp của tôi, tôi đã nhận được cho ''.'','' .. ''và''. DS_Store'' đó là hợp lý cho tôi để lọc ra.Nhưng bạn không thể nắm bắt lỗi Đọc để bạn phải chắc chắn rằng nó không bao giờ có thể xảy ra bằng cách kiểm tra mọi thứ có thể gây ra sự cố _ (tệp tồn tại, quyền chính xác, khác?) _ Trước. – MikeSchinkel

0

tôi sẽ làm điều này để tìm hiểu ...

$type =array('jpg','gif'); 

foreach($type as $val){ 

if($_FILES['filename']['type'] == 'image/$val') 
{ 
echo "its an image file"; 
} 
else{ 
echo "invalid image file" 
} 
+0

Không an toàn. Tôi có thể tiết kiệm một exe như 'hình ảnh/jpeg', ví dụ .. –

+0

tôi đồng ý nhưng đây là một trong những cách tiếp cận ... – sree

+0

tại sao xuống phiếu? nó vẫn có thể xác nhận ... – sree

0

cách tốt hơn và nhanh hơn là sử dụng exif_imagetype(). Một cái gì đó như thế nên làm việc:

$valid_formats = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); 
$file_format = exif_imagetype($filename); 

if(!in_array($file_format, $valid_formats)) 
    echo("File format is not valid"); 
Các vấn đề liên quan