在Java中检测MySQL BLOB的mime类型

时间:2011-05-10 23:51:21

标签: java mysql blob mime-types detection

是的,我知道我们不应该将图像存储在数据库中,谢谢。

那说,有没有办法在java中检测存储在mysql中的BLOB的mime类型?

仅适用于图像(.gif,.png,.jpeg等)我不需要通用工具。

非常感谢你们

  

如果建议加分   解决方案不涉及第三方   libs:)

3 个答案:

答案 0 :(得分:2)

我想你可以看一下标题。您需要将数据读入字节数组,然后检查字节以查看它们是否与不同文件类型的标头匹配。

例如,对于GIF,前三个字节是“GIF”(47 16 49 16 46 16 ),然后是“87a”(38 16 37 16 61 16 )或“89a”(38 16 39 16 61 16 )。

所以这样的事情应该有效(使用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等)。不确定这是不是最好的方法。有人可能会有更好的解决方案。

就第三方图书馆而言,jMimeMagic非常好。这可能是最简单的解决方案:)。

修改

我在这里找到了this article,列出了不同文件类型的标头信息。有一些示例代码,但它是用另一种语言编写的(Clarion)。

答案 1 :(得分:2)

老实说,如果你记得你总是可以使用缓存策略来避免某些问题,那么将图像存储在数据库中是没有问题的。现代计算机往往能够处理大多数情况下的负载。无论如何,存储blob时要记住的一个关键事项是在路上存储mimetype,因为它往往很容易神圣。

答案 2 :(得分:0)

我认为在数据库中存储二进制文件并不是一个好主意,因为如果这种情况发展成长,它可能会非常慢。

即使您想这样做,我认为在存储二进制文件时最好存储mime类型。