Обнаружение MIME-типа MySQL BLOB в Java - PullRequest
5 голосов
/ 11 мая 2011

Да, я знаю, что мы не должны хранить изображения в базе данных , спасибо.

Тем не менее, есть ли способ обнаружить в Java MIME-тип BLOB-объекта, хранящегося в mysql?

Только для изображений (.gif, .png, .jpeg и т. Д.) Мне не нужен инструмент общего назначения.

Большое спасибо, ребята

Бонусные баллы, если предлагается решение не связано с третьей стороной libs:)

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

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

Например, для GIF первые три байта: "GIF "(47 16 49 16 46 16 ), затем" 87a "(38 16 37 16 61 16 ) или "89a" (38 16 39 16 61 16 ).

Так что-то вродеэто должно работать (используется FileInputStream в демонстрационных целях, но вы можете получить двоичные данные из BLOB, используя ResultSet#getBinaryStream(int) или ResultSet#getBinaryStream(String)):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class IdentifyImage {
    public static void main(String[] args) throws IOException {
        FileInputStream in = null;

        try {
            in = new FileInputStream("sample.gif");

            //The following are in base 10
            byte[] gifHeader87a = {71, 73, 70, 56, 55, 97};
            byte[] gifHeader89a = {71, 73, 70, 56, 57, 97};

            byte[] bytes = new byte[6];
            in.read(bytes, 0, 6);

            if(Arrays.equals(gifHeader89a, bytes) || Arrays.equals(gifHeader87a, bytes)) {
               System.out.println("It's a GIF!");
            }

        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}

Вам просто нужно найти байты в заголовке для других типов файлов (например, JPG, PNG и т. Д.).Не уверен, что это лучший способ.У кого-то может быть лучшее решение.

Что касается сторонних библиотек, jMimeMagic довольно хорош.Вероятно, это самое простое решение:).

РЕДАКТИРОВАТЬ

Я нашел эту статью здесь, в которой перечисляется информация заголовка для различных типов файлов.Есть некоторый пример кода, но он написан на другом языке (Clarion).

2 голосов
/ 11 мая 2011

Честно говоря, хранение изображений в базах данных - это нормально, если вы помните, что всегда можете использовать стратегии кэширования, чтобы избежать определенных проблем.А современные компьютеры, как правило, способны справиться с нагрузкой для большинства сценариев.Во всяком случае, ключевая вещь, которую нужно помнить при хранении BLOB-объектов, это хранить MIME-тип с ним по пути, так как тогда его легко угадать.

0 голосов
/ 11 мая 2011

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

Даже если вы хотите это сделать, я думаю, что лучше хранить mime-тип, когда вы храните двоичный файл.

...