我想你可以看看标题。您需要将数据读入字节数组,然后检查字节以查看它们是否与不同文件类型的标头匹配。
例如,对于 GIF,前三个字节是“GIF”(4716 4916 4616),然后是"87a" (3816 3716 6116) 或 "89a" (3816 39 16 6116)。
所以这样的事情应该可以工作(使用FileInputStream 进行演示,但您可以使用ResultSet#getBinaryStream(int) 或ResultSet#getBinaryStream(String) 从BLOB 获取二进制数据):
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 等)的字节。不确定这是否是最好的方法。有人可能有更好的解决方案。
就第 3 方库而言,jMimeMagic 相当不错。这可能是最简单的解决方案:)。
编辑
我在这里找到了this article,它列出了不同文件类型的标题信息。有一些示例代码,但它是用另一种语言 (Clarion) 编写的。