Rails:可以检查字符串是否是二进制文件?

在特定的Rails应用程序中,我将LDAP中的二进制数据提取到变量中进行处理。 有没有办法检查变量是否包含二进制数据? 如果它不是二进制的,我不想继续处理这个变量。 我希望使用is_a?

实际上,我从LDAP中提取的二进制数据是一张照片。 那么也许有更好的方法来确保变量包含二进制JPEG数据? 此检查的结果将决定是继续处理JPEG数据,还是从磁盘渲染默认JPEG。

这个问题实际上比你想象的要多得多。 只有在Ruby 1.9之后才出现了字符(在某些编码中)与原始字节的概念。 因此,在Ruby 1.9中,您可以放弃请求编码。 由于你从LDAP获取东西,所以进入字符串的编码应该是众所周知的,很可能是ISO-8859-1或UTF-8。

在这种情况下,您可以获取编码并对其执行操作:

 some_variable.encoding # => when ASCII-8BIT, treat as a photo 

由于您确实要validation二进制数据是否为照片,因此通过图像库运行它是有意义的。 想到了RMagick。 该文档将向您展示如何validation任何二进制数据实际上是JPEG编码的。 然后,您还可以存储其他属性,例如宽度和高度。

如果你没有安装RMagick,另一种方法是将数据保存到Tempfile中,下载到Unix(假设你在Unix上)并尝试识别文件。 如果您的系统安装了ImageMagick,则identify命令将告诉您有关图像的所有信息。 但只是调用它上面的file也会告诉你:

 ~/Pictures$ file P1020359.jpg P1020359.jpg: JPEG image data, EXIF standard, comment: "AppleMark" 

您需要在Ruby中调用shell中的identifyfile命令:

 %x(identify #{tempfile}) %x(file #{tempfile})