【问题标题】:Determine if a PHP resource contains binary or text确定 PHP 资源是否包含二进制或文本
【发布时间】:2012-08-26 20:58:18
【问题描述】:

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

$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。哼,用处不大。

【问题讨论】:

  • 二进制和所谓的“纯文本”是一回事。只是在纯文本中您实际上可以阅读它,因为那里的字节对人类来说是有意义的,而在“二进制”中则不是。是否意味着它对计算机有任何不同。
  • 当然,但是在我的应用程序中,应该输出文本,但是二进制文件应该只是说(这是一个二进制文件...)而不是输出所有的二进制数据,因为它们可能很大。
  • 另一个不将文件存储在数据库中的好理由
  • MongoDB 和 GridFS 实际上非常好。喜欢我可以用实际字节存储元数据,并查询元数据。加上副本集,文件被分发。

标签: php mongodb resources gridfs


【解决方案1】:

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

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

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

我认为像 MongoDB 这样的无模式数据库在设计阶段至少需要与关系数据库一样多的关注。这是设计数据库时要考虑的一个典型问题:我的数据有什么类型?

【讨论】:

  • 我正在阅读它:while (!feof($stream)) { $data .= fread($stream, 8192); } 我如何查看$data
  • ctype_print 不起作用,因为文本文件可以有换行符、制表符等。
  • 我也意识到了这一点并添加了一个正则表达式。
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多