2010-04-13 43 views
29

Tôi đang hiển thị hình ảnh từ bên ngoài thư mục gốc web của tôi, như thế này:PHP, hình ảnh hiển thị với Header()

header('Content-type:image/png'); 
readfile($fullpath); 

Các content-type: image/png là gì confuses me.

Một người khác đã giúp tôi với mã này, nhưng tôi nhận thấy rằng không phải tất cả hình ảnh đều là PNG. Nhiều người là jpg hoặc gif.
Và chúng vẫn được hiển thị thành công.

có ai biết tại sao không?

Trả lời

44

Giải pháp tốt nhất là nên đọc trong tập tin, sau đó quyết định loại hình ảnh nó là gì và gửi ra tiêu đề thích hợp

$filename = basename($file); 
$file_extension = strtolower(substr(strrchr($filename,"."),1)); 

switch($file_extension) { 
    case "gif": $ctype="image/gif"; break; 
    case "png": $ctype="image/png"; break; 
    case "jpeg": 
    case "jpg": $ctype="image/jpeg"; break; 
    default: 
} 

header('Content-type: ' . $ctype); 

(Lưu ý: đúng content-type cho các tập tin JPG là image/jpeg)

+0

Tôi đánh giá cao mã ví dụ về việc lấy phần mở rộng. Cụ thể là thực hành tốt nhất. – coffeemonitor

+0

bạn được chào đón! – paullb

+3

$ ctype nên được đọc từ getimagesize() – Tobia

2

Trình duyệt thường có thể cho biết loại hình ảnh bằng cách đánh dấu thông tin meta của hình ảnh. Ngoài ra, phải có một khoảng trống trong tiêu đề đó:

header('Content-type: image/png'); 
4

Trình duyệt đoán chính xác nhất với dữ liệu mà họ nhận được. Tính năng này hoạt động để đánh dấu (trang web nào thường gặp sự cố) và nội dung phương tiện khác. Một chương trình nhận được một tập tin thường có thể tìm ra những gì nó nhận được bất kể loại nội dung MIME nó được kể.

Đây không phải là điều bạn nên dựa vào. Bạn nên luôn sử dụng đúng nội dung MIME.

12

Có một lý do tốt hơn để xác định loại hình ảnh. với exif_imagetype

Nếu bạn sử dụng chức năng này, bạn có thể cho biết tiện ích mở rộng thực của hình ảnh.

với phần mở rộng của tên tệp này hoàn toàn không có liên quan, điều này tốt.

function set-header-content-type($file) 
{ 
    //Number to Content Type 
    $ntct = Array("1" => "image/gif", 
        "2" => "image/jpeg", #Thanks to "Swiss Mister" for noting that 'jpg' mime-type is jpeg. 
        "3" => "image/png", 
        "6" => "image/bmp", 
        "17" => "image/ico"); 

    header('Content-type: ' . $ntct[exif_imagetype($file)]); 
} 

Bạn có thể thêm các loại khác từ the link.

Hy vọng điều đó sẽ hữu ích.

0

nếu bạn biết tên tập tin, nhưng không biết các tập tin gia hạn bạn có thể sử dụng chức năng này:

public function showImage($name) 
    { 

     $types = [ 
      'gif'=> 'image/gif', 
      'png'=> 'image/png', 
      'jpeg'=> 'image/jpeg', 
      'jpg'=> 'image/jpeg', 
     ]; 
     $root_path = '/var/www/my_app'; //use your framework to get this properly .. 
     foreach($types as $type=>$meta){ 
      if(file_exists($root_path .'/uploads/'.$name .'.'. $type)){ 
       header('Content-type: ' . $meta); 
       readfile($root_path .'/uploads/'.$name .'.'. $type); 
       return; 
      } 
     } 
    } 

Lưu ý: đúng content-type cho các tập tin JPG là image/jpeg.

2

Mặc dù được đặt tên kỳ lạ, bạn có thể sử dụng hàm getimagesize(). Thông tin này cũng sẽ cung cấp cho bạn thông tin mime:

Array 
(
    [0] => 295 // width 
    [1] => 295 // height 
    [2] => 3 // http://php.net/manual/en/image.constants.php 
    [3] => width="295" height="295" // width and height as attr's 
    [bits] => 8 
    [mime] => image/png 
) 
Các vấn đề liên quan