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

时间:2011-10-01 18:22:09

标签: ruby-on-rails ruby

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

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