Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как получить байты из блоба?  [new]
Док
Member

Откуда: Казань
Сообщений: 7217
Че-та поиском не нашел.

Можно как-то откастовать блоб, чтобы получить на клиента несколько первых байтов?
=================
Док.

Win10 Ultim x64/Deb 10 amd64/Darwin Cocoa:
FB 3.0.7.33374, Lazarus 2.3.0(trunk); FPC 3.3.1(trunk)

Сообщение было отредактировано: 5 окт 21, 16:53
5 окт 21, 17:04    [22379720]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896

в октет и сабстрингом

Posted via ActualForum NNTP Server 1.5

5 окт 21, 17:07    [22379722]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4940
Док,

SELECT
  CAST( SUBSTRING( BLOB_FIELD FROM 1 FOR 3 ) AS VARCHAR(3) )
FROM TABLE_NAME
5 окт 21, 17:08    [22379723]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896

кстати, а БЛОБ-то какой?

Posted via ActualForum NNTP Server 1.5

5 окт 21, 17:08    [22379724]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4940
Мимопроходящий,

Да, правильнее AS VARCHAR(3) CHARACTER SET OCTETS, но хз как там клиент (умеет ли)
5 окт 21, 17:10    [22379726]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Док
Member

Откуда: Казань
Сообщений: 7217
Мимопроходящий
кстати, а БЛОБ-то какой?

ты, как всегда, краток :)

Да, забыл указать, блоб бинарный
CREATE DOMAIN DMN_BLOBIMG AS BLOB SUB_TYPE 0 SEGMENT SIZE 80;


Сообщение было отредактировано: 5 окт 21, 17:06
5 окт 21, 17:16    [22379727]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Док
Member

Откуда: Казань
Сообщений: 7217
YuRock
Да, правильнее AS VARCHAR(3) CHARACTER SET OCTETS, но хз как там клиент (умеет ли)

SELECT
  CAST(SUBSTRING(PHOTOS FROM 1 FOR 4) AS VARCHAR(4) CHARACTER SET OCTETS) AS BYTES_FLD
FROM TBL_PEOPLE
WHERE ID = 1

Спасибо, все робит :)
5 окт 21, 17:35    [22379735]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27315
Док
Спасибо, все робит :)

Тут похоже на определение типа картинки/документа, дак я-бы лучше это делал в отдельное поле и перед отправкой файла.
Да еще и на клиенте, там возможностей поболе будет.
5 окт 21, 17:38    [22379736]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Док
Member

Откуда: Казань
Сообщений: 7217
wadman
Док
Спасибо, все робит :)

Тут похоже на определение типа картинки/документа, дак я-бы лучше это делал в отдельное поле и перед отправкой файла.
Да еще и на клиенте, там возможностей поболе будет.


все верно, только с той разницей, что хранение расширения и способ загрузки картинки в визуальные компоненты уже реализованы. Вот только пока не определился, где дешевле по трудозатратам: анализировать по расширению или по байтам (последний вариант мне кажется изящнее :)

Сообщение было отредактировано: 5 окт 21, 17:51
5 окт 21, 18:02    [22379742]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896

анализируй перед загрузкой БЛОБ-а в базу.
на клиенте.
и добавь в таблицу поле - идентификатор (тип) выявленной сигнатуры.
по-хорошему, ещё конечно надо бы создать доп.таблицу - справочник типов.
но это не обязательно.

Posted via ActualForum NNTP Server 1.5

5 окт 21, 18:16    [22379746]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54808

Мимопроходящий
и добавь в таблицу поле - идентификатор (тип) выявленной сигнатуры.

В зависимости от назначения этот идентификатор может быть имя класса-обработчика
данного изображения или MIME-название для скармливания системе/браузеру/и т.д.

Posted via ActualForum NNTP Server 1.5

5 окт 21, 18:35    [22379749]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4940
Док
YuRock
Да, правильнее AS VARCHAR(3) CHARACTER SET OCTETS, но хз как там клиент (умеет ли)

SELECT
  CAST(SUBSTRING(PHOTOS FROM 1 FOR 4) AS VARCHAR(4) CHARACTER SET OCTETS) AS BYTES_FLD
FROM TBL_PEOPLE
WHERE ID = 1


Спасибо, все робит :)
Опасность в том, что если среди этих 4-х символов есть 0-символы, то клиент может обрезать до них, если тупой (дельфовый IBX именно такой, во всяком случае был).
5 окт 21, 20:53    [22379796]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
shalamyansky
Member

Откуда:
Сообщений: 290
Не все типы картинок имеют однозначную сигнатуру, например, bmp не имеет. Поэтому обычно вьюеры ориентируются на параллельно с файлом приходящий content-type, например, image/jpeg, или в крайнем случае на расширение.
5 окт 21, 21:10    [22379803]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
d7i
Member

Откуда:
Сообщений: 577
shalamyansky
Не все типы картинок имеют однозначную сигнатуру, например, bmp не имеет.

Из Вики:
BITMAPFILEHEADER — 14-байтная структура, которая располагается в самом начале файла.
00 2 bfType WORD Отметка для отличия формата от других (сигнатура формата). Может содержать единственное значение 4D42/424D (little-endian/big-endian).
...

4D42/424D - это буквы MB или BM в ANSI кодировке.
Ради любопытства глянул пару картинок BMP - везде есть буквы BM.
Хотя, всякое бывает...
5 окт 21, 21:33    [22379811]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4940
d7i
shalamyansky
Не все типы картинок имеют однозначную сигнатуру, например, bmp не имеет.

Из Вики:
BITMAPFILEHEADER — 14-байтная структура, которая располагается в самом начале файла.
00 2 bfType WORD Отметка для отличия формата от других (сигнатура формата). Может содержать единственное значение 4D42/424D (little-endian/big-endian).
...

4D42/424D - это буквы MB или BM в ANSI кодировке.
Ради любопытства глянул пару картинок BMP - везде есть буквы BM.
Хотя, всякое бывает...
У меня с bmp, gif, jpeg, png не было проблем никогда при загрузке (определении типа картинки) по мервым байтам.
5 окт 21, 21:48    [22379816]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
d7i
Member

Откуда:
Сообщений: 577
YuRock
У меня с bmp, gif, jpeg, png не было проблем никогда при загрузке (определении типа картинки) по мервым байтам.

Да, эти форматы имеют адекватные заголовки с определенной сигнатурой (флагом).
Так что "флаг в руки"... :-)
5 окт 21, 23:23    [22379845]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Док
Member

Откуда: Казань
Сообщений: 7217
Мимопроходящий
анализируй перед загрузкой БЛОБ-а в базу.
на клиенте.


хорошая мысль. Особенно, если картинке до этого намеренно изменили расширение. В наст. момент в базу кладется расширение, указанное в имени файла.
Мне подумалось, что поле с расширением файла можно будет похерить, если достаточно будет проанализировать первые 3-4 байта блоба

shalamyansky
Не все типы картинок имеют однозначную сигнатуру, например, bmp не имеет.

а вики говорит, что это не так
0x4d42/0x424d

YuRock
У меня с bmp, gif, jpeg, png не было проблем никогда при загрузке (определении типа картинки) по мервым байтам.

в Лазаре по дефолту у TOpenPictureDialog проперть Filter выглядит примерно так:
+
Graphic (*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm)|*.png;*.xpm;*.bmp;*.cur;*.ico;*.icns;*.jpeg;*.jpg;*.jpe;*.jfif;*.tif;*.tiff;*.gif;*.pbm;*.pgm;*.ppm|
Portable Network Graphic (*.png)|*.png|
Pixmap (*.xpm)|*.xpm|
Bitmaps (*.bmp)|*.bmp|
Cursor (*.cur)|*.cur|
Icon (*.ico)|*.ico|
Mac OS X Icon (*.icns)|*.icns|
Joint Picture Expert Group (*.jpeg;*.jpg;*.jpe;*.jfif)|*.jpeg;*.jpg;*.jpe;*.jfif|
Tagged Image File Format (*.tif;*.tiff)|*.tif;*.tiff|
Graphics Interchange Format (*.gif)|*.gif|
Portable PixMap (*.pbm;*.pgm;*.ppm)|*.pbm;*.pgm;*.ppm|
All files (*.*)|*.*|

Тут поневоле задумаешься, а сколько форматов будет достаточно для кроссплаформы? :)
5 окт 21, 23:41    [22379849]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 63467
Док> если картинке до этого намеренно изменили расширение.

Расширение вообще не имеет значения.
Его может не быть или быть "неправильным".
Файл 'зелёный.крокодил' может быть BMP,
JPG, TXT, EXE или файлом базы данных.

> В наст. момент в базу кладется расширение, указанное в имени файла.
> Мне подумалось, что поле с расширением файла можно будет похерить,

Не можно, а нужно. Я в своё время делал примерно, как
МП описал - был перечень "поддерживаемых форматов",
один из которых "выбирался" на клиенте. В БД ничего
не анализировалось, только хранилось.

> Тут поневоле задумаешься, а сколько форматов
> будет достаточно для кроссплаформы? :)

Это решать тебе (исходя из логики ПО), а не кросс-платформе. :)
IIRC, мне в своё время для графики хватило BMP/PNG/JPG, хотя
по идее какой-нибудь TIFF не помешал бы для многостраничности.

Posted via ActualForum NNTP Server 1.5

6 окт 21, 10:01    [22379908]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27315
Гаджимурадов Рустам
Расширение вообще не имеет значения.
Его может не быть или быть "неправильным".

Этим много кто страдает, когда вместо "нормального" расширения приходит webp (или как его там).
Не раз сталкивался. Ирфаном открываю, а он предлагает его переименовать с настоящим расширением.
6 окт 21, 11:55    [22379966]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
d7i
Member

Откуда:
Сообщений: 577
На самом деле Imageformat-ов очень много. Вот, к примеру, XnViewMP поддерживает 500 форматов:
https://www.xnview.com/en/image_formats/
Для практической работы с БД, я думаю, хватит и десятка самых распостраненных.
И, конечно, самый надежный способ анализировать по сигнатуре в файле.
Что ещё тут обсуждать?
6 окт 21, 12:30    [22379988]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896

06.10.2021 12:30, d7i пишет:
> Вот, к примеру, XnViewMP поддерживает 500 форматов:
> https://www.xnview.com/en/image_formats/

у них там и CSV среди графических чалится ;)

Posted via ActualForum NNTP Server 1.5

6 окт 21, 12:33    [22379991]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
shalamyansky
Member

Откуда:
Сообщений: 290
shalamyansky
Не все типы картинок имеют однозначную сигнатуру, например, bmp не имеет. Поэтому обычно вьюеры ориентируются на параллельно с файлом приходящий content-type, например, image/jpeg, или в крайнем случае на расширение.

Виноват, ляпнул по старой памяти, не проверив. Bmp имеет сигнатуру ВМ. Наверное, я ico имел в виду. Там нули в начале, не очень надежный способ идентификации типа.
6 окт 21, 16:12    [22380121]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
shalamyansky
Member

Откуда:
Сообщений: 290
Хранить в отдельных полях полезно и content-type, и размер в байтах, и размер в пикселах, и даже хеш файла. Это несколько избыточно, зато потом поиск эффективно можно организовать. Например, ограничить выборку только маленькими (меньше 1MB) картинками типа gif. Даже если сейчас нет такой нужды, когда-нибудь обязательно возникнет. А при наличии хеша можно быстро найти по известной картинке (и более ничего) соответствующую запись.
6 окт 21, 16:24    [22380134]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
shalamyansky
Member

Откуда:
Сообщений: 290
Кстати, вот весьма полезная задача - найти дубли картинок. Шарашить квадратичным поиском сравнения блобов тяжеловато будет, особенно на емких базах. А если есть хеш и индекс по нему - милое дело.
6 окт 21, 16:50    [22380158]     Ответить | Цитировать Сообщить модератору
 Re: Как получить байты из блоба?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54808

Хэш тут как раз ни к чему, поскольку он для почти одинаковых картинок выдаст
совершенно разные значения. Тут "антихэш" какой-то нужен.

Posted via ActualForum NNTP Server 1.5

6 окт 21, 17:03    [22380168]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить