11

I want to get the file type (eg. image/gif) by URL using PHP.I had tried

<?php
$image_path="http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png";
exif_imagetype($image_path);
?>

The above code gave me a blank page and the following code returned "3":

<?php
$image_path="http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png";
echo exif_imagetype($image_path);
?>

Where am I going wrong? Solved: using Fileinfo to fetch content type

Ashish Srivastava
  • 167
  • 1
  • 1
  • 10

7 Answers7

15

Here is a PHP function I came up with:

/**
 * @param $image_path
 * @return bool|mixed
 */
function get_image_mime_type($image_path)
{
    $mimes  = array(
        IMAGETYPE_GIF => "image/gif",
        IMAGETYPE_JPEG => "image/jpg",
        IMAGETYPE_PNG => "image/png",
        IMAGETYPE_SWF => "image/swf",
        IMAGETYPE_PSD => "image/psd",
        IMAGETYPE_BMP => "image/bmp",
        IMAGETYPE_TIFF_II => "image/tiff",
        IMAGETYPE_TIFF_MM => "image/tiff",
        IMAGETYPE_JPC => "image/jpc",
        IMAGETYPE_JP2 => "image/jp2",
        IMAGETYPE_JPX => "image/jpx",
        IMAGETYPE_JB2 => "image/jb2",
        IMAGETYPE_SWC => "image/swc",
        IMAGETYPE_IFF => "image/iff",
        IMAGETYPE_WBMP => "image/wbmp",
        IMAGETYPE_XBM => "image/xbm",
        IMAGETYPE_ICO => "image/ico");

    if (($image_type = exif_imagetype($image_path))
        && (array_key_exists($image_type ,$mimes)))
    {
        return $mimes[$image_type];
    }
    else
    {
        return FALSE;
    }
}
pgee70
  • 3,707
  • 4
  • 35
  • 41
13

the best way for my understanding

if (!function_exists('getUrlMimeType')) {
    function getUrlMimeType($url)
    {
        $buffer = file_get_contents($url);
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        return $finfo->buffer($buffer);
    }
}

is to create function depend on finfo class

Jehad Ahmad Jaghoub
  • 1,225
  • 14
  • 22
9
<?php
 $image_path="http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png";
 echo exif_imagetype($image_path);
?>

It returned 3 because png response type as maciej said.

Try this to get like this image/png:

echo mime_content_type($image_path);

Try this:

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension   
echo finfo_file($finfo, $image_path) . "\n";
finfo_close($finfo);
Rafael
  • 7,605
  • 13
  • 31
  • 46
Avis
  • 505
  • 4
  • 14
6

You are not going wrong anywhere. exif_imagetype returns the value of one of the image type constants: http://php.net/manual/en/image.constants.php

If you would like to convert this to an extension string, you could use a switch statement:

$typeString = null;
$typeInt = exif_imagetype($image_path);
switch($typeInt) {
  case IMG_GIF:
    $typeString = 'image/gif';
    break;
  case IMG_JPG:
    $typeString = 'image/jpg';
    break;
  case IMG_JPEG:
    $typeString = 'image/jpeg';
    break;
  case IMG_PNG:
    $typeString = 'image/png';
    break;
  case IMG_WBMP:
    $typeString = 'image/wbmp';
    break;
  case IMG_XPM:
    $typeString = 'image/xpm';
    break;
  default: 
    $typeString = 'unknown';
}

You may want to change the order to most to least frequently expected for better performance.

Gentle153
  • 327
  • 2
  • 5
  • 15
3

In the first example, you're getting a blank page because you're not doing anything with the return value from the function call. In the second example, you're getting a valid response. See the manual page for exif_imagetype() for a list of what the values mean.

Alex Howansky
  • 50,515
  • 8
  • 78
  • 98
  • 1
    thanx for the link, we can use `image_type_to_mime_type(exif_imagetype($url))` to get the `'image/xxx'` mime type – ctf0 Jan 11 '18 at 20:36
2

exif_imagetype returns the image type. The response, 3, indicates it is IMAGETYPE_PNG, the correct response.

Grice
  • 1,345
  • 11
  • 24
1

3 is image type response for PNG image. See: http://php.net/manual/en/function.exif-imagetype.php

Maciej Asembler
  • 656
  • 3
  • 5