确定字符串的文件类型

时间:2011-11-04 15:29:47

标签: php mysql blob

PHP提供了各种识别文件类型的方法,但是当有问题的文件仅作为二进制字符串表示而不是作为光盘上的实际文件存在时,是否可以识别数据类型?

这样做的原因是我在CMS上做了一些维护工作,以前的开发人员有点想要将图像数据作为数据库BLOB存储到系统中。我当前的项目是将BLOB转储到文件中,并将文件的路径保存到数据库中以代替BLOB。

正如我所说的那样,我的前任有点狡猾,他不仅将所有这些数据存储为BLOB,而且还没有将数据的数据类型保存在任何地方。

我为该项目的一部分编写的迁移实用程序将文件保存到没有扩展名的光盘,尝试使用exif_imagetype()确定文件的类型,如果它设法识别文件类型,则使用正确的文件重命名该文件延期。

但是,使用图像数据的类也需要更新,以便它们可以继续使用光盘上的路径和文件而不是BLOB。

创建和更新图像的方法需要二进制字符串(BLOB到数据库中),在理想的世界中,我宁愿重写这些方法以使用is_uploaded_file,move_uploaded_file等。但是,在类的任何地方都没有证据表明直接操作$ _FILES数组,因此,如果代码有多复杂(并且没有任何评论可以提供帮助),我们无法找到它。

作为权宜之计的解决方案,直到我最终找到实际的文件上传管理代码,我计划将文件数据作为当前完成的类中的字符串进行操作,但将字符串保存到文件而不是数据库中。这应该最小化对依赖于此类的代码库的其他部分的影响。

我可以执行迁移脚本正在执行的操作,并在保存并重新标识文件后对其进行重命名,但在存在文件的情况下,这可能会出现问题。在将数据提交到光盘之前,我宁愿知道数据类型是什么。

3 个答案:

答案 0 :(得分:2)

finfo_buffer()就是你想要的。你可以传递你的字符串,它会根据你的mime.magic文件告诉你文件类型是什么。

此处有更多信息:http://us3.php.net/manual/en/function.finfo-buffer.php

答案 1 :(得分:1)

您可以使用finfo_buffer。它适用于字符串而不是磁盘文件。

答案 2 :(得分:0)

如果你只使用图像,你可以在字符串的前几个字节中找到文件类型 - PNG文件以0x89开头0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A,GIF - 带GIF,JPEG包含FFD8头。我已经编写了用于解析这3种类型的标题的脚本,但由于我没有在这里,我会在得到它后立即更新我的答案