0

我正在使用一个库,扩展它,我有这个方法来检查数据是否是媒体

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?

4

2 回答 2

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
}

我没有测试上面的代码,所以可能会有轻微的错误,但你可以将它用作基础,但它应该可以工作;)

于 2013-10-27T19:54:06.117 回答
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));

视频/mp4的 MIME 。其他 MIME 类型在这里

于 2013-10-27T21:04:00.647 回答