【问题标题】:Determine file type of a string确定字符串的文件类型
【发布时间】:2011-11-04 15:29:46
【问题描述】:

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

原因是我正在对 CMS 进行一些维护工作,之前的开发人员有点笨拙,决定将图像数据作为数据库 BLOB 存储到系统中。我当前的项目是将 BLOB 转储到文件中,并将文件的路径保存到数据库中以代替 BLOB。

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

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

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

创建和更新图像的方法需要二进制字符串(将 BLOB 写入数据库),在理想情况下,我宁愿重写这些方法以使用 is_uploaded_file、move_uploaded_file 等。但是,在类中的任何地方都没有证据直接操作 $_FILES 数组,因此文件数据显然来自类外部,但考虑到代码的复杂程度(并且没有 cmets 提供帮助),我找不到它。

在我最终找到实际的文件上传管理代码之前,作为权宜之计,我计划像目前所做的那样将文件数据作为类中的字符串进行操作,但将字符串保存到文件而不是数据库中。这应该最大限度地减少对依赖此类的代码库其他部分的影响。

我可以执行迁移脚本正在执行的操作,并在保存并识别文件后重命名文件,但如果那里已经有文件,这可能会出现问题。在将数据提交到磁盘之前,我宁愿知道数据类型是什么。

【问题讨论】:

    标签: php mysql blob


    【解决方案1】:

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

    更多信息在这里:http://us3.php.net/manual/en/function.finfo-buffer.php

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-10
          • 2020-02-23
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          • 2013-09-28
          • 1970-01-01
          • 2021-09-10
          相关资源
          最近更新 更多