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

Mat*_*ark 5 ruby ruby-on-rails

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

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

Joo*_*aij 4

实际上,这个问题的含义比您想象的要多得多。自从 Ruby 1.9 以来,才出现了字符(在某些编码中)与原始字节的概念。因此,在 Ruby 1.9 中,您也许可以不必请求编码。由于您是从 LDAP 获取内容,因此传入的字符串的编码应该是众所周知的,很可能是 ISO-8859-1 或 UTF-8。

在这种情况下,您可以获得编码并采取行动:

some_variable.encoding # => when ASCII-8BIT, treat as a photo
Run Code Online (Sandbox Code Playgroud)

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

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

~/Pictures$ file P1020359.jpg 
P1020359.jpg: JPEG image data, EXIF standard, comment: "AppleMark"
Run Code Online (Sandbox Code Playgroud)

您需要从 Ruby在shell 中调用identify和命令:file

%x(identify #{tempfile})
%x(file #{tempfile})
Run Code Online (Sandbox Code Playgroud)