【问题标题】:PHP- Get file type by URLPHP- 通过 URL 获取文件类型
【发布时间】:2014-11-13 03:41:29
【问题描述】:

我想通过 URL 使用 PHP 获取文件类型(例如图像/gif)。我试过了

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

上面的代码给了我一个空白页,下面的代码返回“3”:

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

我哪里错了? 已解决:使用 Fileinfo 获取内容类型

【问题讨论】:

    标签: php file


    【解决方案1】:

    在第一个示例中,您得到一个空白页,因为您没有对函数调用的返回值做任何事情。在第二个示例中,您得到了有效响应。请参阅 the manual page for exif_imagetype() 了解这些值的含义。

    【讨论】:

    • 感谢链接,我们可以使用image_type_to_mime_type(exif_imagetype($url)) 获取'image/xxx' mime 类型
    【解决方案2】:

    exif_imagetype 返回图像类型。响应为 3,表示它是 IMAGETYPE_PNG,正确响应。

    【讨论】:

    • 不能得到像“image/png”这样的输出吗?
    • 您可以硬编码一个开关并将其值与它进行比较,或者使用 finfo_file 来获取 MIME 类型 (image/png)
    【解决方案3】:

    3 是 PNG 图像的图像类型响应。看: http://php.net/manual/en/function.exif-imagetype.php

    【讨论】:

    • 不能得到像“image/png”这样的输出吗?
    • 那么你必须写...mime_content_type @AshishSrivastava
    • @user3923716 我得到:警告:mime_content_type() [function.mime-content-type]: Failed identify data 0:(null) in /home/appfesti/public_html/y.php on line 4
    【解决方案4】:
    <?php
     $image_path="http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png";
     echo exif_imagetype($image_path);
    ?>
    

    它返回 3 因为 png 响应类型如 maciej 所说。

    试试这个image/png

    echo mime_content_type($image_path);
    

    试试这个:

    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension   
    echo finfo_file($finfo, $image_path) . "\n";
    finfo_close($finfo);
    

    【讨论】:

    • 当我将 url 存储在 $image_path 中时,它会显示:警告:mime_content_type($image_path) [function.mime-content-type]: failed to open stream: No such file or directory in /home/appfesti /public_html/y.php 在第 4 行
    • 是的,它已被弃用... $finfo = finfo_open(FILEINFO_MIME_TYPE);
    • @jGrice 我可以在 url 中使用 fileinfo 吗?
    • 明白了吗?@AshishSrivastava
    • @user3923716 当我使用 URL 时,我得到 警告:finfo_file() [function.finfo-file]: Failed identify data 0:(null)。所以我决定将文件存储在我的服务器上,而不是使用 url 查询 :)
    【解决方案5】:

    你不会在任何地方出错。 exif_imagetype 返回图像类型常量之一的值:http://php.net/manual/en/image.constants.php

    如果您想将其转换为扩展字符串,您可以使用 switch 语句:

    $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';
    }
    

    您可能希望将顺序更改为最不常见的预期以获得更好的性能。

    【讨论】:

    • 应该删除IMG_JPG 大小写,image/jpg 不是有效的 MIME 类型。
    【解决方案6】:

    这是我想出的一个 PHP 函数:

    /**
     * @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;
        }
    }
    

    【讨论】:

    • 我得到了这个代码并且工作正常!谢谢。只能复制和粘贴。工作顺利!
    【解决方案7】:

    我理解的最佳方式

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

    是创建函数依赖finfo class

    【讨论】:

    • 这应该是批准的答案。这是最干净的 imo
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2013-10-29
    • 1970-01-01
    • 2015-10-24
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多