2011-10-01 5 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" 

Вам нужно вызвать команды identify и file в shell from Ruby:

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

Кстати, получить кодировку непосредственно из переменной воны Работает, если данные JPEG закодированы в строковый формат, такой как Base64. –

+0

Удивительное объяснение. На данный момент я просто использую '.encoding.name! = 'ASCII-8BIT'', который будет работать нормально, пока я не решит более подробно остановиться позже. Спасибо за тонну за такой более чем полный ответ. –

+0

Я рад помочь! –

Смежные вопросы