Как я могу определить тип файла из blob / filestream? - PullRequest
7 голосов
/ 17 июня 2009

Давным-давно мы купили "готовое" приложение, способное хранить файлы в виде BLOB-объектов внутри SQL Server. Мы заметили, что размер базы данных увеличился более чем в два раза за последние шесть месяцев из-за более частого использования этого поля BLOB-объектов одним отделом. В результате приложение стало мучительно медленным.

Мне было поручено удалить поле blob из базы данных и сохранить файл в реальной файловой системе. К сожалению, приложение не хранит тип файла в базе данных. Хотя я могу прочитать файл, как он существует в базе данных, я не знаю, в каком расширении сохранить файл. Служба поддержки приложения больше не поддерживает эту версию программного обеспечения и не будет рассказывать нам об извлечении данных. К сожалению, у нас нет доступа к их исходному коду.

Любые предложения будут с благодарностью! Заранее спасибо!

Ответы [ 7 ]

7 голосов
/ 17 июня 2009

вы можете посмотреть на первые несколько байтов и выяснить наиболее распространенные типы файлов

http://www.garykessler.net/library/file_sigs.html

2 голосов
/ 17 июня 2009

Вы можете попробовать использовать TriD http://mark0.net/soft-trid-e.html

Сканирует файлы и пытается определить расширение.

2 голосов
/ 17 июня 2009

Не сохраняйте его как любой тип. Сохраните его как файл без расширения. Если ты не знаешь, что это, не притворяйся. Если приложение, которое сохранило его, запрашивает его, верните его из файловой системы так же, как и из базы данных; как двоичные данные. База данных не заботится о типе данных Бинарного объекта; и ты не должен.

1 голос
/ 17 июня 2009

Вы можете использовать функцию FindMimeFromData () в UrlMon.dll (используя pinvoke).

См. эту страницу для примера и эту страницу MSDN для документации функции.

0 голосов
/ 17 июня 2009

В ваших словах "... мне было поручено ..." - вы уверены, что это не проблема, которую можно решить, выполнив некоторую оптимизацию базы данных? Идти по пути взлома унаследованного приложения, для которого у вас нет исходного кода и для которого нет поддержки, - это то, чего вы хотите избежать как можно больше.

Итак, посмотрите на проблему здесь - медлительность приложения. Так почему же это медленно? Что-то, что не удалось решить с помощью индекса базы данных?

Если вам нужно извлечь BLOB-объекты в файловую систему, то почему формат файла имеет значение? Конечно, приложение предназначено для выполнения запроса к базе данных, чтобы в любом случае получить файл - как вам поможет извлечение больших двоичных объектов в файловую систему?

В качестве отступления, я обычно использую команду Unix <strong>file</strong> для идентификации файлов по магическим числам.

0 голосов
/ 17 июня 2009

Другой вариант - физически разбить вашу базу данных. Вы можете сохранить таблицу, содержащую поле blob, в другом файле базы данных, который можно сохранить на другом жестком диске / шпинделе. Диск, содержащий таблицу больших двоичных объектов, можно дополнительно оптимизировать, сделав его RAID 0 или RAID 10.

Это может ускорить процесс. Кроме того, этот подход устраняет необходимость изменения логики приложения.

0 голосов
/ 17 июня 2009

Откуда вы знаете, что эта информация читаема человеком?

Расширения файлов предназначены для того, чтобы связать определенное программное обеспечение для открытия файла, чтобы при двойном щелчке файла .txt его обрабатывал notepad.exe.

Если вы записываете их в файловую систему только для разгрузки базы данных, то никакого конкретного расширения не требуется. Если вы хотите связать с ним программное обеспечение, используйте соответствующее расширение

...