确定PHP资源是否包含二进制文件或文本

时间:2012-09-01 06:43:58

标签: php mongodb resources gridfs

我正在使用MongoDB并使用GridFS将文件存储到PHP。我通过以下方式提取文件:

$mongo = new Mongo;
$images = $monogo->my_db->getGridFS('images');
$image = $images->findOne('epic-beard-man.png');
$stream = $image->getResource();

这很酷,因为$stream是PHP resource。我需要的是确定流/资源是二进制还是文本。如果是文本,我想输出它,否则如果它是二进制的,我不想输出它。

是否有像is_binary($stream)

这样的神奇功能

修改

echo get_resource_type($stream);

返回STREAM。哼,不是很有用。

1 个答案:

答案 0 :(得分:3)

如果没有实际读取资源,则无法检查此内容。您可以阅读整个内容并查找不可打印的字符(如果它是图像,则应该很快发生)。您可以使用ctype_print检查“可印刷性”,遗憾的是,它会返回false标签和换行符,因此它可能不是最好的。您还可以构建自己的正则表达式来检查数据:

preg_match(':^(\P{Cc}|[\t\n])*$:', $data)

然而,最好和最简单的方法是将数据类型(可能是MIME类型)与对象一起保存。这样你就不需要在显示时做任何魔术了。

我认为像MongoDB这样的无模式数据库在设计阶段至少需要像关系数据库那样谨慎。在设计数据库时,这是一个典型的考虑因素:我的数据有哪些类型?