2011-10-01 71 views
5

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

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

回答

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" 

你需要调用identifyfile命令在shell from Ruby

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

顺便说一句,直接从变量韩元得到编码如果JPEG数据被编码为像Base64这样的字符串格式,那么它就不起作用。 –

+0

真棒解释。现在,我只是简单地使用'.encoding.name!='ASCII-8BIT',它可以正常工作,直到我决定稍后再详细阐述。非常感谢这样一个非完整的答案。 –

+0

我很乐意提供帮助! –

相关问题