Blob data for PNG

  • 本文关键字:PNG for data Blob php
  • 更新时间 :
  • 英文 :


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

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?

我通常建议你使用来自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
}

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

如果你有一个最新的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类型在这里。

最新更新