определить, является ли blob изображением без загрузки всего поля? - PullRequest
3 голосов
/ 11 августа 2009

есть ли способ прочитать только несколько байтов из поля типа BLOB в базе данных (для этого вопроса не имеет значения марка БД) и определить, является ли двоичный контент изображением (предположим, что это один из : JPG, GIF, PNG)? У меня есть веб-приложение, которое хранит файлы в базе данных, и если это изображение, я хочу показать миниатюру, в противном случае я хочу показать значок ... но у меня нет информации MIMETYPE, хранящейся где-либо еще для BLOB-объекта (это не мой дизайн) ... и поскольку это веб-приложение, загрузка изображения должна происходить в отдельном вызове (getImage.ashx) от записи тега image... и когда я пишу тег, который мне не нужен, чтобы прочитать весь BLOB-объект в библиотеку, определить, является ли он изображением, изменить его размер ... и т. д. и т. д. Я хотел бы иметь возможность просмотреть первые несколько байтов и знаю, нужно ли мне написать тег или нет. Я недостаточно хорошо разбираюсь в структурах / форматах файлов изображений, чтобы знать, есть ли какой-то стандартный заголовок в первых нескольких байтах, которые я мог бы прочитать, чтобы определить, является ли это JPG, GIF или PNG.

имеет смысл?

если вы хотите помочь мне конкретно (вместо того, чтобы вообще отвечать, можно ли это сделать), тогда я использую .NET C # и SQL 2005

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 августа 2009

PNG начинаются с: 89 50 4E 47 0D 0A 1A 0A ; см http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

GIF начинаются с 47 49 46 38 37 61 (GIF87a) или 47 49 46 38 39 61 (GIF89a) ; см http://www.fileformat.info/format/gif/egff.htm

JPEG начинаются с FF D8 FF E0 xx xx 4A 46 49 46 00 (EDIT: добавление недостающей части заголовка; xx xx - длина заголовка в байтах); см http://www.obrador.com/essentialjpeg/headerinfo.htm

ссылка: http://wangrui.wordpress.com/2007/06/19/file-signatures-table/

1 голос
/ 11 августа 2009

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

См. Эту статью для ознакомления с , как подключить потоковый ридер к вашему считывателю данных .

С учетом всего сказанного, я, вероятно, просто получу все байты, если только изображения не слишком большие, главным образом потому, что любая скорость, которую вы получаете от изучения заголовка, может быть потеряна при погружении в скважину во второй раз.

Другой тактикой может быть создание представления, которое проверяет поле и предоставляет тип, основанный на байтах первого заголовка, в SQL. Вид некрасиво, но работает в крайнем случае.

1 голос
/ 11 августа 2009
  • JPEG файлы начинаются с FF D8 FF
  • GIF файлы начинаются с GIF89a (47 49 46 38 39)
...