определить, является ли blob-объект изображением, не загружая все поле целиком?

StackOverflow https://stackoverflow.com/questions/1261106

  •  12-09-2019
  •  | 
  •  

Вопрос

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

есть смысл?

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

Спасибо!

Это было полезно?

Решение

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 (ПРАВКА:добавление недостающей части заголовка;xx xx - длина заголовка в байтах) ;видишь http://www.obrador.com/essentialjpeg/headerinfo.htm

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

Другие советы

  • JPEG файлы начинаются с FF D8 FF
  • GIF файлы начинаются с GIF89a (47 49 46 38 39)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top