PNG的Blob数据

时间:2013-10-27 19:45:50

标签: php

我正在使用lib,在它上面行,并且我有这种检查数据是否是媒体的方法

function isMedia($blob) {
    // Check for a JPG header.
    if ($blob[0] == chr(0xFF) && $blob[1] == chr(0xD8)) {
      return TRUE;
    }

    // Check for a MP4 header.
    if ($blob[0] == chr(0x00) && $blob[1] == chr(0x00)) {
      return TRUE;
    }

    return FALSE;
  }

我对Blob数据不太好,我知道它检查数据的第一部分是否有特殊编码,我将如何检查PNG?

2 个答案:

答案 0 :(得分:0)

我通常建议您使用来自GD或ImageMagick的PHP内置图像检测功能,但我认为您有充分的理由。因此,要检查PNG标头,您需要确保blob的第一部分匹配(根据http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

89  50  4e  47  0d  0a  1a  0a

类似

// Is PNG
if (
    $blob[0] == chr(0x89) &&
    $blob[1] == chr(0x50) &&
    $blob[2] == chr(0x4e) &&
    $blob[3] == chr(0x47) &&
    $blob[4] == chr(0x0d) &&
    $blob[5] == chr(0x0a) &&
    $blob[6] == chr(0x1a) &&
    $blob[7] == chr(0x0a)
   ) {
     // Yes
}

我没有对上面的代码进行过测试,因此可能会出现轻微的错误,但您可以将其用作基础,但它应该有效;)

答案 1 :(得分:0)

最好的方法,如果你有一个最近的PHP并且可以做到(否则,请参阅Steven的解决方案)是使用fileinfo并让libmagic(与ImageMagick无关)做它的魔力:

function isMedia($blob) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $accepted_types = array(
        'image/jpeg',
        'image/png',
        'video/mp4',
    );
    $mime = $finfo->buffer($blob);
    return in_array($mime, $accepted_types);
}

实际上,如果您只想告诉别人的音频和视频媒体,您也可以这样做:

list($broad,) = explode('/', $mime); // get the "image" from "image/png"
return (('video' == $broad) || ('image' == $broad));

video/mp4的MIME。其他MIME类型here