Я представляю, что вы можете взглянуть на заголовки.Вам необходимо прочитать данные в байтовый массив, а затем проверить байты, чтобы увидеть, соответствуют ли они заголовкам для различных типов файлов.
Например, для 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).